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



