我分配的内存数组上出现意外的数组长度

use*_*596 0 c

在下面的代码中,我初始化了一个 int 指针,然后动态分配了内存。

但是当我想显示数组的大小时,它不会显示值5

int *p=NULL;
 
 int tab[]={};
 
 p=tab;
 
 p=malloc(5*sizeof(int));
 
printf("sizeof(tab)=%d",(int)sizeof(tab));
Run Code Online (Sandbox Code Playgroud)

Eri*_*hil 6

int *p=NULL;定义p为指针并将其初始化为空指针。

int tab[]={};C 标准没有定义,因为标准要求数组非空。但是,一些编译器会允许这样做并创建一个长度为零的数组。(除了作为结构的最后一个成员或联合的成员之外,这种数组基本上没有用处。)

p=tab;如果数组不为空,则设置p为指向第一个元素的位置tab

p=malloc(5*sizeof(int));为 5 保留内存int并设置p为指向该内存。

printf("sizeof(tab)=%d",(int)sizeof(tab));打印tab. 由于tab是一个零长度数组,它在支持它的实现中打印“sizeof(tab)=0”。

此外,如果你打印了sizeof p,它会打印指针p的大小,而不是它指向的大小。sizeof报告有关其操作数类型的信息。类型是编译时信息。sizeof不报告执行时间信息,例如在某个位置保留了多少内存。(除了它会报告可变长度数组的大小。)