- 論壇徽章:
- 0
|
本帖最后由 blackgenius 于 2010-09-21 09:36 編輯
我寫了這么一段代碼,測試字符串和字符數(shù)組的長度問題,測試strlen和sizeof函數(shù)的異同,結(jié)果有一處很不明白,先看程序- #include <stdio.h>
- #include <string.h>
- int
- main()
- {
- char str[5] = “12345”;
- char *pstr;
- int i;
- void test(char str[5]);
- pstr = "12345";
- printf("In the main func\n");
- for (i=0; i<5; i++)
- printf("%c\n", str[i]);
- printf("%s\n", pstr);
- printf("sizeof(str[]): %d\n", sizeof(str));
- printf("strlen(pstr): %d\n", strlen(pstr));
- printf("For the array:\n");
- test(str);
- printf("For the pointer:\n");
- test(pstr);
- return 0;
- }
- void test(char str[5]) {
- int s;
- s = sizeof(str);
- printf("%s\n", str);
- printf("The value of sizeof func: %d\n", s);
- }
復制代碼 這個程序運行的結(jié)果如下:
程序運行結(jié)果.jpg (18.98 KB, 下載次數(shù): 9)
下載附件
CentOS系統(tǒng)
2010-09-12 12:53 上傳
首先,語句For the array: 之后跟的打印結(jié)果,結(jié)尾出現(xiàn)亂碼是和原因?
其次,在array情況下,sizeof的值為什么會是4?<在pointer情況下sizeof的值為4是因為字符串只能用strlen去求長度,sizeof得到的會是指針本身的值的長度(long型)>
最后,為什么函數(shù)形參設為char str[5]型,對于字符數(shù)組,傳參到函數(shù)之后,打印其sizeof的值時得到的是4?
高手指點迷津,小生謝過~
發(fā)現(xiàn)我太幼稚了,仔細查了一下,當我的函數(shù)用數(shù)組做形參時,等價于傳遞了數(shù)組的首地址給函數(shù),意味著在函數(shù)中使用sizeof函數(shù)求得的都是等價于對字符串指針求sizeof,得到的是地址所占的空間大小,也就是一個long型的數(shù)據(jù)sizeof的大小。T T只笑自己太幼稚啊~哈哈!不過還請指點,Array情況下輸出為什么出現(xiàn)了亂碼?
-------------
2010-09-21
今天我再次發(fā)現(xiàn)這個問題的詭異,發(fā)現(xiàn)當時的我太過于天真了~我上面的解釋都是有問題的,我認為;
我想請教高手,為什么同樣是sizeof(str),為什么在test函數(shù)外面,得到的是5;而在test函數(shù)里面,得到的卻是4?傳給sizeof的都是地址啊,如果說對于字符串只能用strlen去求長度,那為什么在main函數(shù)里test函數(shù)外的時候我們也可以sizeof求得正確值?而且我自己回憶,經(jīng)常對于字符串sizeof,以此來初始化一個字符數(shù)組。我已經(jīng)快暈厥了~請高手指教!
經(jīng)過自己的測試,終于算是結(jié)了這個問題了,呵呵~字符數(shù)組的sizeof是數(shù)組的長度,而字符指針的sizeof是long的長度,所以在main里test外,sizeof str得到的會是正確的數(shù)組長度,而當數(shù)組作為參數(shù)傳遞到函數(shù)test時,數(shù)組被強制類型轉(zhuǎn)換成為字符指針,因為在test函數(shù)里面得到的是錯誤的值。在這里糾正一下我上面的說法^_^ |
|