C语言数组字节大小
我的问题是为什么将myArray传递到C语言数组字节大小,c,C,我的问题是为什么将myArray传递到sizeof中可以得到与第二种方法相同的结果 我知道myArray表示指向四个int空间地址中的第一个的地址,但是sizeof如何识别4int空间的字节大小 sizeof不是一个函数,它是什么?sizeof(myArray)提供了4个字符指针数组的大小,可能是4x4=16sizeof是一个运算符,在大多数情况下在编译时对其求值。它是由语言定义的,用来完成这项任务——语言说,sizeof的工作是知道事物的大小,所以它就是这样知道的 &myArray为您提供类型
sizeof
中可以得到与第二种方法相同的结果
我知道myArray
表示指向四个int空间地址中的第一个的地址,但是sizeof
如何识别4int
空间的字节大小
sizeof
不是一个函数,它是什么?sizeof(myArray)
提供了4个字符指针数组的大小,可能是4x4=16sizeof
是一个运算符,在大多数情况下在编译时对其求值。它是由语言定义的,用来完成这项任务——语言说,sizeof
的工作是知道事物的大小,所以它就是这样知道的
&myArray
为您提供类型为char(*)[4]
的数组指针&myArray+1
对这样一个数组进行算术运算,给出刚好经过4x4数组的数组指针的地址。如果用原始地址减去该地址,将得到数组的大小(以字节为单位)
这两种表单在功能方面没有真正的区别,只是sizeof
更具可读性
(作为旁注,第二个版本生成一个名为
ptrdiff\u t
的类型,如果希望使用printf打印此类型,则应使用%tu格式说明符。)
为什么将myArray传递到sizeof可以得到与第二个方法相同的结果
myArray
是由指向char
的4个指针组成的数组。所以sizeof(myArray)=4*sizeof(指针指向字符)
。通常在64位机器中,指针的大小是64位(8字节),因此是32字节
至于你的第二次打印
char *myArray[] = { "aaaaaa", "ccccc", "bbbbbb", "111111" };
因为myArray
是数组,所以&myArray
是指向数组的指针。这里(&myArray+1)
指向下一个指针数组。将其视为指向char的下一个4个指针块。因此(&myArray+1)-(&myArray)
与原始指针数组的大小相同
顺便说一句,您应该使用适当的
printf
控制字符串:
- 对于
,请使用sizeof
: printf(“%zu\n”,sizeof(myArray))%zu
- 您的第二个printf可以工作,但会就int的转换发出警告:
警告:从指针转换为不同大小的整数[-Wpointer到int cast]
printf("%d\n", (int)(&myArray + 1) - (int)(&myArray));
是一元运算符。“我知道myArray表示指向第一个的地址…”在传递到sizeof
printf(“%d\n”,sizeof(myArray))时不是代码>-->printf(“%zu\n”,sizeof(myArray))
myArray
是一个字符数组
。在许多情况下,它会衰减为指向char*
的指针。这不是那种情况。有关详细信息,请参阅此文档。
printf("%d\n", (int)(&myArray + 1) - (int)(&myArray));
char *p_start = (char *)(&myArray + 1);
char *p_end = (char *)(&myArray);
printf("%td", p_start - p_end );