问题描述
- 如何解决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数组中存储指针处理的。
解决方案二:
分配堆空间用malloc
free(a[i].num[j]);
->
free(a[i].num[0]);
free(a[i].num[1]);
free(a[i].num[2]);
解决方案三:
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;
}
如果这样打印出来就会乱码
解决方案五:
“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("%dn",(int)ptr);
printf("%dn",*ptr);
a[i].num[j] = (int)ptr;
}
}
printf("n-------------n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%dn",a[i].num[j]);
printf("%dn",*(int*)a[i].num[j]);
free((int*)a[i].num[j]); //编译器编译显示这里出错
}
}
free(a);
return 0;
}
IDE:VC2008
解决方案八:
怎么不用指针数组呢,更方便些。