Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言数组字节大小_C - Fatal编程技术网

C语言数组字节大小

C语言数组字节大小,c,C,我的问题是为什么将myArray传递到sizeof中可以得到与第二种方法相同的结果 我知道myArray表示指向四个int空间地址中的第一个的地址,但是sizeof如何识别4int空间的字节大小 sizeof不是一个函数,它是什么?sizeof(myArray)提供了4个字符指针数组的大小,可能是4x4=16sizeof是一个运算符,在大多数情况下在编译时对其求值。它是由语言定义的,用来完成这项任务——语言说,sizeof的工作是知道事物的大小,所以它就是这样知道的 &myArray为您提供类型

我的问题是为什么将myArray传递到
sizeof
中可以得到与第二种方法相同的结果

我知道
myArray
表示指向四个int空间地址中的第一个的地址,但是
sizeof
如何识别4
int
空间的字节大小

sizeof
不是一个函数,它是什么?

sizeof(myArray)
提供了4个字符指针数组的大小,可能是4x4=16
sizeof
是一个运算符,在大多数情况下在编译时对其求值。它是由语言定义的,用来完成这项任务——语言说,
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
    ,请使用
    %zu

    printf(“%zu\n”,sizeof(myArray))

  • 您的第二个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 );