c-free()循环,正在触发一个断点,并且似乎没有释放该元素



我一直在做一个任务,这个任务已经完成了,我所需要做的就是释放双指针分配的内存,但对于循环,当我遍历循环时,它会触发一个断点,似乎并没有完全清除。我不确定是什么触发了它。上下文:CreateData函数基本上是一个返回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 3n");
    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.2fn", records[*counter]->exam1);
    printf("Exam 2:%0.2fn", 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的声明/定义。

void menu(STUDENT* records, int user_size, float* averageTotal[])

以下是您如何在代码中使用它:

menu(records, userinput, &averageTotal[0]);

第一个参数records被定义为指向STUDENT的指针。但是menu的定义只期望一个指向STUDENT的指针。

看看代码的其余部分,是定义不正确,而不是函数调用。

相同功能:

void menu(STUDENT* records, int user_size, float* averageTotal[])

menu期望一个指向指针的指针为其第三个参数浮动。但你在这里的调用中提供了一个指向索引的指针:

menu(records, userinput, &averageTotal[0]);

不需要进一步阅读,很明显你需要更好地理解指针(或者停止打字太快,理解你在写什么!)。

最后,一个真正的挑剔。函数CreateData()应该被删除,它的使用应该被直接调用calloc/malloc()的函数所取代。

相关内容

  • 没有找到相关文章