struct P
{
int z;
int* arr;
};
int main()
{
struct P* p=(struct P*)malloc(sizeof(struct P));
if(p == NULL)
{
printf("%s \n",strerror(errno));
}
else
{
p->arr=(int*)malloc(4*sizeof(int));
if(p->arr == NULL)
{
printf("%d \n",strerror(errno));
}
else
{
p->z=100;
int j=0;
for(j=0;j<4;j++)
{
p->arr[j]=j;
}
printf(" ");
for(j=0;j<4;j++)
{
printf("%d ",p->arr[j]);
}
printf("\n");
printf(" %d \n",p->z);
free(p->arr);
p->arr=NULL;
printf("%d \n",sizeof(p));
free(p);
p=NULL;
}
}
}
只要创建p,malloc有空间就一定不为NULL,而且你的结构体的大小就8在堆中几乎不占多少,所以目前基本数看不见堆栈溢出
最后一直查的是结构体p的大小,结构体p是int类型(4),int *arr是指针(4),所以你无论怎么修改指针所指向的数组长度,但是数组的指针地址还是4
【以下回答由 GPT 生成】
问题1:为什么在以下代码中,结构体P的动态内存分配一直成功,并且该内存大小永远不会变化?
在给结构体P分配内存时,使用了malloc函数。malloc函数会从堆中分配一块指定大小的内存,并返回该内存的首地址。
在代码中,使用了sizeof(struct P)作为分配内存的大小,sizeof操作符用于计算结构体P的大小。结构体P包含了一个int类型的变量z和一个int指针类型的变量arr。对于int变量,其大小为4字节;对于指针变量,其大小也为4字节(在32位系统中)。因此,结构体P的大小为8字节。所以使用sizeof(struct P)作为参数向malloc函数传递,分配了8字节的内存空间。
由于malloc返回的内存地址是一个指针,声明p为struct P类型指针,并将malloc返回的地址转换成该类型,这样p就指向了分配的内存空间。
因此,结构体P的动态内存分配一直成功,并且该内存大小永远不会变化是因为在代码中分配的大小是固定的,且不会发生改变。
问题2: 如果我改变了p->arr的malloc参数,为什么p的内存大小始终不变?
在代码中,p->arr=(int)malloc(4sizeof(int))分配了4个int类型的内存空间,并将首地址赋给了p->arr。
p->arr指向的是int类型的指针,因此分配的内存空间的大小是4个int变量所占的内存空间大小的总和。在这里,每个int变量所占的内存空间大小是4字节,所以4个int变量之和是16字节。所以,如果将p->arr的malloc参数改为其他值,在分配内存空间的大小上会有所改变。
然而,p->arr并不影响p本身的内存大小。p的内存大小由struct P的大小决定,而不受p->arr分配的内存大小的影响。在代码中,sizeof(p)返回的是p指针所指向的内存块的大小,即sizeof(struct P)的大小。所以,无论p->arr的内存大小如何变化,p的内存大小都不会发生变化。
总结:分配内存空间的大小和内存块的地址是独立的。p->arr分配的内存空间大小只会影响p->arr指向的内存块的大小,而不会影响p本身的内存大小。所以,无论如何改变p->arr的malloc参数,p的内存大小始终不变。