字符串大小与字符串指针的大小

时间:2021-01-16 06:28:02

标签: c

在以下代码中:

char *title = "VP";
printf("Sizeof title: %zd | Sizeof *title: %zd | Strlen: %zd\n", sizeof title, sizeof *title, strlen(title));
<块引用>

标题大小:8 | Sizeof *title: 1 |力量:2

似乎 sizeof title 对指向字符串的指针进行操作(对我来说是 8 个字节),而 strlen(title) 可以预见地给了我 2。

为什么在取消引用指针时 sizeof *title 会产生 1 而不是 3(字符串的字节长度)?例如,为什么它会这样做而不是它会产生什么:

printf("%zd\n", sizeof("VP"));
// 3

2 个答案:

答案 0 :(得分:3)

指针的大小总是指针本身的大小,而不是它指向的内容。这是因为 sizeof 主要是一个编译时运算符(结果由编译器计算),编译器无法知道指针在运行时可能指向什么。

至于 sizeof *title,它与 sizeof title[0] 相同,后者是单个 char。并且 char 的大小是 1(顺便说一下,它被指定为总是1,无论实际位宽如何)。

最后关于sizeof "VP"。在 C 中,所有文字字符串实际上都是字符的数组,包括终止的空字符。所以文字串 "VP" 是一个包含三个字符的数组,因此它的大小是 3


为了使答案更完整一些,我说 sizeof 运算符主要是编译时。这当然不适用于 variable-length arrays,其中编译器必须插入代码以可以在运行时提取的方式存储数组的实际大小。如果数组衰减为指针,那么您所拥有的只是指针,sizeof 再次返回指针本身的大小。

还有一个关于字符串文字数组的说明。虽然它们在技术上是非常量数组,但仍然无法修改。尝试修改字符串文字会导致未定义行为。因此,文字字符串实际上是只读的。

答案 1 :(得分:1)

title 的类型是 char *,所以 *title 的类型是 char不是 char [3]。因此,sizeof *title 等价于 sizeof (char),即 1。

title 不是字符串,它只是指向字符串的第一个元素。