Chinaunix

标题: calloc三维数组,赋值不成功,总是内存错误。 [打印本页]

作者: ppazhang    时间: 2014-01-14 19:14
标题: calloc三维数组,赋值不成功,总是内存错误。
谢谢了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int i=0, j=0, k=0 ;
    char ***data;
        
    data = (char***)calloc(10,sizeof(char**));
    for(i=0;i <10;i++)
    {   
        *data = (char**)calloc(2,sizeof(char*));
        for(j=0;j<2;j++)
        {   
            **data = (char*)calloc(16,sizeof(char));
            memset(*(*(data+i)+j),0x0,16);
            printf("(%d,%d)\n",i,j);
        }   
    }   
    for(i=0;i<10;i++)
    {   
        for(j=0;j<2;j++)
        {   
            memcpy(data[i][j] ,"HelloHelloHello",16);
            printf("(%d,%d)%s\n",i,j,data[i][j]);
        }   
    }   
    for(i=0;i<10;i++)
    {   
        for(j=0;j<2;j++)
        {   
            free(data[i][j]);
                                      for(i=0;i<10;i++)
    {   
        for(j=0;j<2;j++)
        {   
            memcpy(data[i][j] ,"HelloHelloHello",16);
            printf("(%d,%d)%s\n",i,j,data[i][j]);
        }   
    }   
    for(i=0;i<10;i++)
    {   
        for(j=0;j<2;j++)
        {   
            free(data[i][j]);
        }
        free(data[i]);
    }
    free(data);
    return 0;
}

作者: w_anthony    时间: 2014-01-15 09:20
粗略的看了一下,*data = 和**data等于肯定是错误的,应该是data[i] = 和data[i][j] = 。
下面你自己复制的时候都复制乱了就不好说了。
不过你这个用法实在是太非主流了,只会把自己思维搞乱,还不如分配一个一维的,然后自己算偏移呢。

作者: linyunxian    时间: 2014-01-15 10:01
本帖最后由 linyunxian 于 2014-01-15 10:47 编辑

回复 2# w_anthony


    显然楼主没有明白指针/数组的区别是什么。两者相互乱用。
比如申请一个16×10×2的三维数组。常用下面的方法来申请连续的数组空间。
char (*data)[10][2];
data = malloc (16*sizeof(*data));
作者: 除美灭日平韩    时间: 2014-01-15 11:11
回复 2# w_anthony

*data = 和**data= 这样的表达错误

是不是就是因为那个"数组名不是左值,不能被改变"?
   
作者: w_anthony    时间: 2014-01-15 13:26
回复 4# 除美灭日平韩


    什么乱七八糟的,看清楚代码啊,想到哪里去了
作者: 除美灭日平韩    时间: 2014-01-15 13:29
回复 5# w_anthony

本人菜鸟,看不出来问题

   
作者: w_anthony    时间: 2014-01-15 13:39
回复 6# 除美灭日平韩


    那你对应起来看啊,你看下calloc的返回值给谁了,free的都是谁,现在两者是不同吧?那么哪个是错的?
作者: ppazhang    时间: 2014-01-17 14:15
多谢大家,谢谢大家的提醒,我找到错误了。下面是我改正的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int i=0, j=0, k=0 ;
    char ***data;
   
    data = (char***)calloc(10,sizeof(char**));
    for(i=0;i <10;i++)
    {   
        data[i] = (char**)calloc(2,sizeof(char*));
        for(j=0;j<2;j++)
        {   
            data[i][j] = (char*)calloc(16,sizeof(char));
            //*(*(data+i)+j)="Hello.";
            memset(*(*(data+i)+j),0x0,16);
            printf("(%d,%d)\n",i,j);
        }   

    }   
    for(i=0;i<10;i++)
    {   
        for(j=0;j<2;j++)
        {   
            memcpy(data[i][j] ,"HelloHelloHello",16);
            printf("(%d,%d)%s\n",i,j,data[i][j]);
        }   
    }  
            for(i=0;i<10;i++)
    {   
        for(j=0;j<2;j++)
        {   
            free(data[i][j]);
        }
        free(data[i]);
    }
    free(data);
    return 0;
}


作者: ppazhang    时间: 2014-01-17 14:18
附上我的运行结果了
(0,0)
(0,1)
(1,0)
(1,1)
(2,0)
(2,1)
(3,0)
(3,1)
(4,0)
(4,1)
(5,0)
(5,1)
(6,0)
(6,1)
(7,0)
(7,1)
(8,0)
(8,1)
(9,0)
(9,1)
(0,0)HelloHelloHello
(0,1)HelloHelloHello
(1,0)HelloHelloHello
(1,1)HelloHelloHello
(2,0)HelloHelloHello
(2,1)HelloHelloHello
(3,0)HelloHelloHello
(3,1)HelloHelloHello
(4,0)HelloHelloHello
(4,1)HelloHelloHello
(5,0)HelloHelloHello
(5,1)HelloHelloHello
(6,0)HelloHelloHello
(6,1)HelloHelloHello
(7,0)HelloHelloHello
(7,1)HelloHelloHello
(8,0)HelloHelloHello
(8,1)HelloHelloHello
(9,0)HelloHelloHello
(9,1)HelloHelloHello

作者: ppazhang    时间: 2014-01-17 14:21
回复 3# linyunxian

我还真不明白他俩的区别。
   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2