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