读书人

二维构造体指针初始化后赋值失败

发布时间: 2013-01-23 10:44:49 作者: rapoo

二维结构体指针初始化后赋值失败
本帖最后由 kingnch 于 2012-12-12 19:29:58 编辑 我自定义了一个结构体PPP,结构体内部就是简单的float和int类型数值。然后写了对不同维数的结构体进行初始化的子函数,二维初始化的子函数如下:


PPP **loc2ppp(int n1, int n2)
{
int i2;
PPP **p;
if ((p=(PPP **)malloc(n2*sizeof(PPP *)))==NULL)
return NULL;
if ((p[0]=(PPP *)malloc(n2*n1*sizeof(PPP)))==NULL) {
free(p);
return NULL;
}

for (i2=0; i2<n2; i2++) {
p[i2] = (PPP*)p[0]+sizeof(PPP)*n1*i2;
}

return p;
}


用来初始化二维指针的时候没有问题,但是在赋值的时候就会有问题,而且并不是所有维数都有问题,比如:
PPP **abc = loc2ppp(9, 9);

然后对abc[][]依次赋值,当循环到对abc[7][0]赋值时就会报错。

这问题很多天都没解决,愁死我了。麻烦大家帮忙检查一下给点意见,谢谢!
[解决办法]
给你改了一下,你再调调

PPP **loc2ppp(int n1, int n2)
{
int i1, i2;
PPP **p;

if ((p=(PPP **)malloc(n2*n1*sizeof(PPP *)))==NULL){
return NULL;
}
if ((p[0]=(PPP *)malloc(n2*n1*sizeof(PPP)))==NULL) {
free(p);
return NULL;
}

for (i1=0; i1<n1; i1++) {
for (i2=0; i2<n2; i2++) {
p[i1][i2] = p[0]+ i1+i2;
}
}

return p;
}

[解决办法]
p[i2] = (PPP*)p[0]+sizeof(PPP)*n1*i2;
这个赋值肯定通不过编译的,p[i2]需要的是地址,你能保证你右边那个值是你的程序有权使用的内存地址?
关于二维动态数组的创建和销毁,可以参考 http://blog.csdn.net/zhcosin/article/details/8275603
[解决办法]
p[i2] = (PPP*)p[0]+sizeof(PPP)*n1*i2;

改成:
p[i2] = (PPP*)p[0]+n1*i2;

就可以了
[解决办法]
我觉得更好的办法为什么不这样呢:
PPP **loc2ppp(int n1, int n2)
{
PPP **column;
PPP *line;
int i;
if((column=(PPP **)malloc(n2*sizeof(PPP *) + n1 * n2*sizeof(PPP)))==NULL)
return NULL;
line = (PPP *)(column + n2);
for(i = 0; i != n2; ++i)
column[i] = line + i *n2;
return column;
}

读书人网 >C语言

热点推荐