首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-01-23 
二维结构体指针初始化后赋值失败本帖最后由 kingnch 于 2012-12-12 19:29:58 编辑我自定义了一个结构体PPP

二维结构体指针初始化后赋值失败
本帖最后由 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;
}

热点排行