給定的代碼中,func()
?函數打印的?name_len
?是?指針的大小,而不是字符串的長度。具體原因如下:
代碼分析
#include <stdio.h>
#include <string.h>void func(char *name) {printf("name_len:%d", sizeof(name)); // 打印的是指針的大小,而非字符串長度
}int main() {printf("hello world\n");char string[] = "helloworldll";func(string);return 0;
}
關鍵問題
-
sizeof(name)
?的行為-
name
?是一個?char*
?類型的指針(參數傳遞時數組退化為指針)。 -
sizeof(name)
?返回的是?指針變量本身占用的字節數,而不是字符串的長度。 -
在?32 位系統?中,指針通常占?4 字節;在?64 位系統?中,指針通常占?8 字節。
-
-
字符串長度的正確獲取方式
-
如果需要獲取字符串的長度(不包括?
'\0'
),應使用?strlen(name)
。 -
如果需要獲取數組的總大小(包括?
'\0'
),應在數組定義的作用域內使用?sizeof(string)
(但無法通過指針參數實現)。
-
修正后的代碼
c
復制
下載
void func(char *name) {printf("name_len:%zu", strlen(name)); // 使用 strlen 獲取字符串長度 }int main() {char string[] = "helloworldll";func(string); // 輸出: name_len:12(字符串 "helloworldll" 的長度)return 0; }
總結
-
sizeof(name)
:返回指針變量的大小(4 或 8 字節),與字符串內容無關。 -
strlen(name)
:返回字符串的實際長度(直到?'\0'
?前的字符數)。 -
sizeof(string)
(僅在數組定義的作用域內有效):返回整個數組的字節大小(如?char string[13]
?會返回 13)。
輸出示例
-
原代碼在 64 位系統運行會輸出:
name_len:8
(指針大小)。 -
修正后代碼輸出:
name_len:12
(字符串長度)。