如何解决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;
}

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数组中存储指针处理的。

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

不是这样的一定要给结构体当中的元素分配空间
#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;
}
如果这样打印出来就会乱码

分配堆空间用malloc

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

“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

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