iT邦幫忙

0

c語言length問題

length正常應該是3吧 為什麼加了for迴圈後length就會變成6?
把for迴圈註解掉,printf length又變正常的3,for應該沒有去加length吧? 求解

#include <stdio.h>
#include <string.h>
int main(void){
char buffer[] = {1,2,3};
int length;

length = strlen(buffer);

printf("length=%d\n",length);

for(int i=0;i<=length-1;i++){
	printf("buffer[%d]=%d\n",i,buffer[i]);
}

printf("length=%d\n",length);

return 0;	

}

看更多先前的討論...收起先前的討論...
asqweff11 iT邦新手 5 級 ‧ 2019-03-13 09:50:07 檢舉
參考 https://blog.csdn.net/qq_40830407/article/details/80279134
最後加'\0'可解
小魚 iT邦大師 1 級 ‧ 2019-03-13 11:52:02 檢舉
題外話,
一般我們都用 i<length 就好了,
為什麼要多打那些呢?
weiclin iT邦高手 4 級 ‧ 2019-03-13 12:14:25 檢舉
因為 strlen 會一直計算到看見 '\0' 為止, 而你的陣列裡面沒有 '\0', 所以讀到超出範圍的記憶體去了, 超出範圍的地方會擺什麼東西完全看編譯器的心情, 這種寫法亂跑是正常, 還能正確跑出結果是狗屎運
淺水員 iT邦大師 6 級 ‧ 2019-03-13 12:51:55 檢舉
突然想到 big5 的「許功蓋」問題,當字元編碼的位元組序列存在 '\0',會有很多地方要另外處理。
小魚 iT邦大師 1 級 ‧ 2019-03-13 15:25:17 檢舉
不是 許蓋功 嗎?
怎麼可以任意幫人家改名字呢?
淺水員 iT邦大師 6 級 ‧ 2019-03-13 15:36:07 檢舉
可能其中一個是藝名?
https://zh.wikipedia.org/wiki/%E5%A4%A7%E4%BA%94%E7%A2%BC
Homura iT邦高手 1 級 ‧ 2019-03-13 21:49:08 檢舉
許功蓋. 許蓋功都行@@
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2019-03-13 09:39:11
最佳解答

換個 compiler 版本看看

同樣的 source code 可以得到不同的結果
這就是 C 語言的迷人之處

1.length=3版本
https://ithelp.ithome.com.tw/upload/images/20190313/20001787ZVvL7oBh6a.png

2.length=6版本
https://ithelp.ithome.com.tw/upload/images/20190313/20001787uQVFi39dgP.png

asqweff11 iT邦新手 5 級 ‧ 2019-03-13 09:49:16 檢舉

用VS2017跑長度變15,蠻神奇的,沒看到這篇還真不知道這問題

小魚 iT邦大師 1 級 ‧ 2019-03-13 11:50:55 檢舉

我也是, length = 15

4
Homura
iT邦高手 1 級 ‧ 2019-03-13 09:47:52

strlen()應該是判斷字串長度
不是陣列長度
改用sizeof()
應該就沒問題了

length = sizeof(buffer);
clmm iT邦新手 5 級 ‧ 2019-03-14 16:26:49 檢舉

要先搞懂「址」與「值」還有表示方法,應該就懂了

我要發表回答

立即登入回答