动态内存分配一直创建成功?内存大小为第一次创建,以后不在变化?

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;
        }
    }
}

img


改变struct P 为什么一直创建成功
改变p->arr的malloc参数为什么,p的内存大小始终不变

只要创建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的内存大小始终不变。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^