如何解决C语言给结构体当中的数组分配堆空间的问题

#include
#include
struct A{
int num[3];
};

int main()
{
int i,j;
struct A *a = (struct A *)calloc(3,sizeof(struct A));
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
a[i].num[j] = (int *)calloc(1,sizeof(int));
}
for(i=0;i<3;i++)
free(a[i].num[j]); //编译器编译显示这里出错
free(a);
return 0;
}

8个回答

int _tmain(int argc, _TCHAR* argv[])
{
    int i,j;
    struct A *a = (struct A *)calloc(3,sizeof(struct A));
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            int * ptr = (int *)calloc(1,sizeof(int));
            a[i].num[j] = (int)ptr;
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            free((int*)a[i].num[j]); //编译器编译显示这里出错
        }
    }
    free(a);
    return 0;
}

你这问题陷阱太多了:)
我是按照你想在num数组中存储指针处理的。

qq_17458949
qq_17458949 回复qq_17458949: 是a[i].num[j]我上面的字打错了
接近 5 年之前 回复
qq_17458949
qq_17458949 gcc可以编译通过并打印出a[i][j]的值,但是vc++能打印出它的值但调试运行到free((int*))a[i].num[j]后发生中断错误
接近 5 年之前 回复
qq_17458949
qq_17458949 gcc可以编译通过并打印出a[i][j]的值,但是vc++能打印出它的值但调试运行到free((int*))a[i].num[j]后发生中断错误
接近 5 年之前 回复
wafstudio
wafstudio 回复qq_17458949: ptr是指针(按你代码的意思,怀疑你这就错了,你是想给数组赋值吧),(int)ptr是地址,*ptr应该是零,你打印一下。
接近 5 年之前 回复
qq_17458949
qq_17458949 我编译了一下你的代码但如果把 a[i].num[j] = (int)ptr;打印出来之后内存报错
接近 5 年之前 回复
qq_17458949
qq_17458949 我编译了一下你的代码但如果把 a[i].num[j] = (int)ptr;打印出来之后内存报错
接近 5 年之前 回复

分配堆空间用malloc

free(a[i].num[j]);
->
free(a[i].num[0]);
free(a[i].num[1]);
free(a[i].num[2]);

wafstudio
wafstudio num[10000];
接近 5 年之前 回复

struct A{
int num[3];
};
中num是数组,不用分派空间,给A分派空间后num自然就有了。
a[i].num[j]是数组值,不是指针,free肯定会出问题,删掉即可。

wafstudio
wafstudio 看错了free((int*)(a[i].num[j]));试一下
接近 5 年之前 回复

不是这样的一定要给结构体当中的元素分配空间
#include
#include
struct A{
int num[3];
};
int main()
{
int i,j;
struct A *a = (struct A *)calloc(3,sizeof(struct A));
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
a[i].num[j] = (int *)calloc(1,sizeof(int));
}
for(i=0;i<3;i++)
free(a[i].num[j]); //编译器编译显示这里出错
free(a);
return 0;
}
如果这样打印出来就会乱码

“a[i].num[j]”定义的是int型,当然报错。强制转换int*试试,或者定义的时候就定义成int*。

把两个for 揉一起吧

#include "stdafx.h"
#include "stdlib.h"

struct A{
    int num[3];
};


int _tmain(int argc, _TCHAR* argv[])
{
    int i,j;
    struct A *a = (struct A *)calloc(3,sizeof(struct A));
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            int * ptr = (int *)calloc(1,sizeof(int));
            printf("%d\n",(int)ptr);
            printf("%d\n",*ptr);

            a[i].num[j] = (int)ptr;
        }
    }

    printf("\n-------------\n");

    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%d\n",a[i].num[j]);
            printf("%d\n",*(int*)a[i].num[j]);

            free((int*)a[i].num[j]); //编译器编译显示这里出错
        }
    }
    free(a);
    return 0;
}

图片说明

IDE:VC2008

怎么不用指针数组呢,更方便些。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问