free() 循环,正在触发一个断点并且似乎没有释放该元素
free() loop, is triggering a break point and seems to not free the element
我一直在做一个已经完成的任务,我需要做的就是释放双指针分配的内存,但是当我通过循环时,循环会触发一个断点,看起来不清除这一切我不确定是什么触发了它。
上下文:Create Data 函数基本上是 returns 一个 malloc 的函数。
int main(void){
int i;
static STUDENT** records;
static float averageTotal[SIZE];
createData();
records = calloc(3, sizeof(STUDENT*));
for (i = 0; i < 3; i++){
records[i] = createData();
}
menu(records, userinput, &averageTotal[0]);
int c;
for (c = 0; c < 3; c++){
free(records[c]);
}
free(records);
return 0;
}
STUDENT* createData()
{
STUDENT* result;
result = malloc(3*sizeof(STUDENT*));
return result;
}
编辑:添加了上下文菜单
void menu(STUDENT* records, int user_size, float* averageTotal[]){
int menuV = 0;
do{
int userinput;
int i;
static int counter = 0;
printf(" **********************************\n");
printf(" * MENU *\n");
printf(" * 1. Add Student *\n");
printf(" * 2. Display all student records*\n");
printf(" * 3. Quit *\n");
printf(" **********************************\n");
scanf_s("%d%*[^\n]", &userinput); '\n' == getchar();
switch (userinput){
// switch statement with loops.
case 1:do
{
addStudent(records, &counter, user_size);
printf("Add another record? 1(y) 2(n)\n");
scanf_s("%d%*[^\n]", &userinput); '\n' == getchar();
} while (userinput == 1);
break;
case 2:
do{
displayStudent(records, user_size);
printf("Display again? 1(y) 2(n)\n");
scanf_s("%d%*[^\n]", &userinput); '\n' == getchar();
} while (userinput == 1);
break;
case 3:
menuV++;
break;
}
} while (menuV == 0);
}
编辑:为上下文添加了 addStudent 函数
void addStudent(STUDENT* records[], int* counter, int user_size)
{ // A simple function that lets the user add values to the struct. The counter keeps track and changes the element.
printf("Student: %d", (*counter+1));
printf(" of 3\n");
printf("Enter name:\n");
fgets(records[*counter]->name, 40, stdin);
printf("Enter Exam 1 Score: \n");
scanf_s("%f", &records[*counter]->exam1);
printf("Enter Exam 2 Score: \n");
scanf_s("%f", &records[*counter]->exam2);
printf("Name:%s",records[*counter]->name);
printf("Exam 1:%0.2f\n", records[*counter]->exam1);
printf("Exam 2:%0.2f\n", records[*counter]->exam2);
(*counter)++;
}
这里有很多问题。您似乎对指针和解引用的掌握很薄弱。
这一行:
static STUDENT** records;
创建一个指向数据类型指针的变量。
理想情况下,您应该将声明更改为惯用的并且无需思考就更容易理解的内容。类似于:
records = calloc(3, sizeof(*records));
在函数 CreateData() 中,您将 records
的成员分配给指向 3 个指针的指针。
这一行:
result = malloc(3 * sizeof(*STUDENT));
应阅读:
result = malloc(3 * sizeof(STUDENT));
。秒数分配的内存是数据类型 STUDENT 长度的三倍。 (你想要什么)。
继续前进 --
这里是函数menu
的declaration/definition。
void menu(STUDENT* records, int user_size, float* averageTotal[])
下面是您在代码中使用它的方式:
menu(records, userinput, &averageTotal[0]);
第一个参数 records
被定义为指向 STUDENT 的指针。但是 menu
的定义只需要一个指向学生的指针。
查看其余代码,错误的是定义而不是函数调用。
相同功能:
void menu(STUDENT* records, int user_size, float* averageTotal[])
menu
期望它的第三个参数是一个指向浮点指针的指针。但是您在此处的调用中提供了指向索引的指针:
menu(records, userinput, &averageTotal[0]);
无需进一步阅读,很明显您需要更好地理解指针(或者停止这么快地打字并理解您在写什么!)。
最后,一个真正的吹毛求疵。函数 CreateData() 应该被删除,它的使用应该被直接调用 calloc/malloc() 的函数代替。
我一直在做一个已经完成的任务,我需要做的就是释放双指针分配的内存,但是当我通过循环时,循环会触发一个断点,看起来不清除这一切我不确定是什么触发了它。 上下文:Create Data 函数基本上是 returns 一个 malloc 的函数。
int main(void){
int i;
static STUDENT** records;
static float averageTotal[SIZE];
createData();
records = calloc(3, sizeof(STUDENT*));
for (i = 0; i < 3; i++){
records[i] = createData();
}
menu(records, userinput, &averageTotal[0]);
int c;
for (c = 0; c < 3; c++){
free(records[c]);
}
free(records);
return 0;
}
STUDENT* createData()
{
STUDENT* result;
result = malloc(3*sizeof(STUDENT*));
return result;
}
编辑:添加了上下文菜单
void menu(STUDENT* records, int user_size, float* averageTotal[]){
int menuV = 0;
do{
int userinput;
int i;
static int counter = 0;
printf(" **********************************\n");
printf(" * MENU *\n");
printf(" * 1. Add Student *\n");
printf(" * 2. Display all student records*\n");
printf(" * 3. Quit *\n");
printf(" **********************************\n");
scanf_s("%d%*[^\n]", &userinput); '\n' == getchar();
switch (userinput){
// switch statement with loops.
case 1:do
{
addStudent(records, &counter, user_size);
printf("Add another record? 1(y) 2(n)\n");
scanf_s("%d%*[^\n]", &userinput); '\n' == getchar();
} while (userinput == 1);
break;
case 2:
do{
displayStudent(records, user_size);
printf("Display again? 1(y) 2(n)\n");
scanf_s("%d%*[^\n]", &userinput); '\n' == getchar();
} while (userinput == 1);
break;
case 3:
menuV++;
break;
}
} while (menuV == 0);
}
编辑:为上下文添加了 addStudent 函数
void addStudent(STUDENT* records[], int* counter, int user_size)
{ // A simple function that lets the user add values to the struct. The counter keeps track and changes the element.
printf("Student: %d", (*counter+1));
printf(" of 3\n");
printf("Enter name:\n");
fgets(records[*counter]->name, 40, stdin);
printf("Enter Exam 1 Score: \n");
scanf_s("%f", &records[*counter]->exam1);
printf("Enter Exam 2 Score: \n");
scanf_s("%f", &records[*counter]->exam2);
printf("Name:%s",records[*counter]->name);
printf("Exam 1:%0.2f\n", records[*counter]->exam1);
printf("Exam 2:%0.2f\n", records[*counter]->exam2);
(*counter)++;
}
这里有很多问题。您似乎对指针和解引用的掌握很薄弱。
这一行:
static STUDENT** records;
创建一个指向数据类型指针的变量。
理想情况下,您应该将声明更改为惯用的并且无需思考就更容易理解的内容。类似于:
records = calloc(3, sizeof(*records));
在函数 CreateData() 中,您将 records
的成员分配给指向 3 个指针的指针。
这一行:
result = malloc(3 * sizeof(*STUDENT));
应阅读:
result = malloc(3 * sizeof(STUDENT));
。秒数分配的内存是数据类型 STUDENT 长度的三倍。 (你想要什么)。
继续前进 --
这里是函数menu
的declaration/definition。
void menu(STUDENT* records, int user_size, float* averageTotal[])
下面是您在代码中使用它的方式:
menu(records, userinput, &averageTotal[0]);
第一个参数 records
被定义为指向 STUDENT 的指针。但是 menu
的定义只需要一个指向学生的指针。
查看其余代码,错误的是定义而不是函数调用。
相同功能:
void menu(STUDENT* records, int user_size, float* averageTotal[])
menu
期望它的第三个参数是一个指向浮点指针的指针。但是您在此处的调用中提供了指向索引的指针:
menu(records, userinput, &averageTotal[0]);
无需进一步阅读,很明显您需要更好地理解指针(或者停止这么快地打字并理解您在写什么!)。
最后,一个真正的吹毛求疵。函数 CreateData() 应该被删除,它的使用应该被直接调用 calloc/malloc() 的函数代替。