【问题标题】:free() loop, is triggering a break point and seems to not free the elementfree() 循环,正在触发断点,似乎没有释放元素
【发布时间】:2015-06-12 17:09:08
【问题描述】:

我一直在做一个几乎完成的任务,我需要做的就是释放双指针分配的内存,但是当我通过循环时,它会触发一个断点并且似乎没有清除这一切我不确定是什么触发了它。 上下文: Create Data 函数基本上是一个返回 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)++;


}

【问题讨论】:

  • 我猜你在 menu 内对 records 做了一些无效的事情。
  • @SamuelEdwinWard 我不认为 Menu 做错了什么,但我会在其中添加它以作为上下文
  • 您是否分配过任何实际的STUDENTs?您的代码仅显示指针的分配。 menu 期待什么?
  • @DavidSchwartz 有人告诉我分配使用 ** 所以 malloc 不会使用连续的内存块
  • 如果createData 应该分配空间来容纳单个STUDENT,它应该这样做 -- result = malloc(sizeof(STUDENT));

标签: c malloc free dynamic-memory-allocation calloc


【解决方案1】:

这里有很多问题。您似乎对指针和取消引用的掌握很薄弱。

这一行:

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() 的函数替换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多