给定的代码中,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
(字符串长度)。