| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1839 人关注过本帖
标题:c程序二级指针内存释放的问题
只看楼主 加入收藏
轉身已陌路
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2014-12-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
c程序二级指针内存释放的问题
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

 
//定义一个结构体
struct strcData {

 
    int age;
    char sex[2];
    char* name;
    char** myName;
};

 
//为结构体动态 分配内存空间
struct strcData* createStruct(int num) {

    /*
     * 构建动态数组时,我们遵循下面的原则:
     * 申请的时候从外层往里层,逐层申请;
     * 释放的时候从里层往外层,逐层释放;
     */
    struct strcData* ps = (struct strcData*) malloc(
            num * sizeof(struct strcData)); //一个结构体数组中包含了num个结构体
    if (ps == NULL) {
        printf("struct strcData* ps-error:分配内存失败");
        exit(1);
    }

    for (int i = 0; i < num; i++) {
        memset(ps + i, 0, sizeof(struct strcData)); //清除分配空间里的垃圾数据
        //为name分配空间,否则name不可用,切记
        ps[i].name = (char*) malloc(30 * sizeof(char));        //为定义的一级指针分配内存空间
        if (ps[i].name == NULL) {
            printf("ps[i].name-error:分配内存失败");
            exit(1);
        }
        memset(ps[i].name, 0, 30 * sizeof(char));        //清除分配空间里的垃圾数据

        //为二级一维指针分配内存
        ps[i].myName = (char **) malloc(num * sizeof(char *));
        if (ps[i].myName == NULL) {
            printf("ps[i].myName-error:分配内存失败");
            exit(1);
        }
        memset(ps[i].myName, 0, num * sizeof(char *));
        //为二级二维维指针分配内存
        for (int j = 0; j < num; j++) {
            ps[j].myName = (char*) malloc(30 * sizeof(char));
            if (ps[j].myName == NULL) {
                return NULL;
                printf("ps[j].myName-error:分配内存失败");
                exit(1);
            }
            memset(ps[j].myName, 0, 30 * sizeof(char));        //清除分配空间里的垃圾数据
        }
    }
    return ps;
}
//内存释放接口
void myFree(struct strcData* myStrc, int num) {

 
    /*
     * 构建动态数组时,我们遵循下面的原则:
     * 申请的时候从外层往里层,逐层申请;
     * 释放的时候从里层往外层,逐层释放;
     */
    if (myStrc == NULL) {
        return;
    }

 
    for (int i = 0; i < num; i++) {      //释放结构体为二级指针字符串所分配的内存空间
 
        if (myStrc[i].name != NULL) {       //释放结构体为一级指针字符串所分配的内存空间
            free(myStrc[i].name);
        }

 
        if (myStrc[i].myName != NULL) {
            for (int j = 0; j < num; j++) {
                if (myStrc[j].myName != NULL)
                    free(myStrc[j].myName);
            }
            free(myStrc[i].myName);
        }
    }

 
    if (myStrc != NULL) {       //释放strcData内存空间
        free(myStrc);
        myStrc = NULL;
    }
}
void testAll() {

 
    //定义结构体数组
    struct strcData* strArr = NULL;
    strArr = createStruct(2);
    //释放内存
    myFree(strArr, 1);
}

二级指针内存释放的时候出了问题,通过调试发现到了第82行free(myStrc[i].myName);这一句出问题了,但是不明白为什么出问题,请大神指导。
搜索更多相关主题的帖子: c程序 
2015-08-26 17:38
轉身已陌路
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2014-12-25
收藏
得分:0 
不能沉了啊,求大神指导啊
2015-08-26 23:10
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:336
专家分:1135
注 册:2014-4-13
收藏
得分:20 
ps[j].myName = (char*) malloc(30 * sizeof(char));
这是哪一层哪一级呀。ps[j].myName=======char**   (char*) malloc(30 * sizeof(char))========char*
这么多的代码,做了什么事情,毫无作为,姑且把它看作是一种测试代码吧,如是这样,那要测试什么呢。
2015-08-27 00:08
快速回复:c程序二级指针内存释放的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017542 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved