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);这一句出问题了,但是不明白为什么出问题,请大神指导。