免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3138 | 回复: 9
打印 上一主题 下一主题

[C] calloc三维数组,赋值不成功,总是内存错误。 [复制链接]

论坛徽章:
1
天蝎座
日期:2014-01-14 19:16:39
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-14 19:14 |只看该作者 |倒序浏览
谢谢了。
#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;
}

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
2 [报告]
发表于 2014-01-15 09:20 |只看该作者
粗略的看了一下,*data = 和**data等于肯定是错误的,应该是data[i] = 和data[i][j] = 。
下面你自己复制的时候都复制乱了就不好说了。
不过你这个用法实在是太非主流了,只会把自己思维搞乱,还不如分配一个一维的,然后自己算偏移呢。

论坛徽章:
0
3 [报告]
发表于 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));

论坛徽章:
2
天秤座
日期:2014-01-15 13:50:58天秤座
日期:2014-02-19 17:09:23
4 [报告]
发表于 2014-01-15 11:11 |只看该作者
回复 2# w_anthony

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

是不是就是因为那个"数组名不是左值,不能被改变"?
   

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
5 [报告]
发表于 2014-01-15 13:26 |只看该作者
回复 4# 除美灭日平韩


    什么乱七八糟的,看清楚代码啊,想到哪里去了

论坛徽章:
2
天秤座
日期:2014-01-15 13:50:58天秤座
日期:2014-02-19 17:09:23
6 [报告]
发表于 2014-01-15 13:29 |只看该作者
回复 5# w_anthony

本人菜鸟,看不出来问题

   

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
7 [报告]
发表于 2014-01-15 13:39 |只看该作者
回复 6# 除美灭日平韩


    那你对应起来看啊,你看下calloc的返回值给谁了,free的都是谁,现在两者是不同吧?那么哪个是错的?

论坛徽章:
1
天蝎座
日期:2014-01-14 19:16:39
8 [报告]
发表于 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;
}

论坛徽章:
1
天蝎座
日期:2014-01-14 19:16:39
9 [报告]
发表于 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

论坛徽章:
1
天蝎座
日期:2014-01-14 19:16:39
10 [报告]
发表于 2014-01-17 14:21 |只看该作者
回复 3# linyunxian

我还真不明白他俩的区别。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP