在以下代码中:
char *title = "VP";
printf("Sizeof title: %zd | Sizeof *title: %zd | Strlen: %zd\n", sizeof title, sizeof *title, strlen(title));Sizeof标题:8\ Sizeof *标题:1小姐:2人
看起来,sizeof title对指向字符串的指针进行操作(对于我来说是8个字节),而strlen(title)可以预测地给出2。
为什么sizeof *title在取消引用指针时产生1而不是3(字符串的字节长度)?例如,为什么它要这样做,而不是它将产生什么:
printf("%zd\n", sizeof("VP"));
// 3发布于 2021-01-16 06:32:20
指针的大小总是指针本身的大小,而不是它所指向的大小。这是因为sizeof主要是一个编译时操作符(结果由编译器计算),编译器无法知道指针在运行时可能指向什么。
至于sizeof *title,它与sizeof title[0]相同,后者是单个char。char的大小是1 (顺便说一句,它被指定为1,不管实际位宽如何)。
最后是关于sizeof "VP"。在C中,所有文字字符串实际上都是字符数组,包括终止空字符。因此,文字字符串"VP"是一个由三个字符组成的数组,因此它的大小是3。
为了使答案更完整一点,我认为sizeof操作符主要是编译时。当然,对于变长阵列来说不是这样的,编译器必须插入代码来存储数组的实际大小,这样才能在运行时获取数组。如果数组衰变为指针,那么您所拥有的就是指针,sizeof再次返回指针本身的大小。
还有一个关于字符串文字数组的注释。虽然它们在技术上是非常数数组,但它们仍然不能被修改。试图修改字符串文字会导致未定义的行为。因此,文字字符串实际上是只读的.
发布于 2021-01-16 15:55:00
title的类型是char *,所以*title的类型是char,而不是char [3]。因此,sizeof *title等同于sizeof (char),即1。
title不是字符串,它只是指向字符串的第一个元素。
https://stackoverflow.com/questions/65747055
复制相似问题