【问题标题】:C - Debug Assertion Failed: _CrtIsValidHeapPointer(block)C - 调试断言失败:_CrtIsValidHeapPointer(block)
【发布时间】:2019-12-25 14:20:26
【问题描述】:

我正在尝试使用 VS2019 从 C 中的 .csv 文件中读取数据,但出现断言错误。 我得到的断言错误是 _CrtIsValidHeapPointer,我认为这与内存泄漏有关,但我无法意识到是什么触发了它。

任何帮助将不胜感激。

我的结构如下所示:

struct movie
{
    double score;
    char* title;
    int year;
    char* actors;
    char* genre;
};

而我的功能是:

void readMoviesFromCSV(movie* movies)
{
    FILE* inputFile;
    fopen_s(&inputFile, "Movies.csv", "r");

    if (inputFile == NULL)
    {
        fclose(inputFile);
        printf("Error opening file.\n");
        exit(1);
    }

    char* lineBuffer = (char*)calloc(sizeof(char), 2048);
    char* current = (char*)calloc(sizeof(char), 512);

    fgets(lineBuffer, 2048, inputFile); // Discarding of the header

    for (int i = 0; i < numberOfMovies; i++)
    {
        fgets(lineBuffer, 2048, inputFile);

        current = strtok_s(lineBuffer, ",", &lineBuffer);
        (movies + i)->score = atof(current);

        current = strtok_s(lineBuffer, ",", &lineBuffer);
        strcpy_s((movies + i)->title, 512, current);

        current = strtok_s(lineBuffer, ",", &lineBuffer);
        (movies + i)->year = atoi(current);

        current = strtok_s(lineBuffer, ",", &lineBuffer);
        strcpy_s((movies + i)->actors, 512, current);

        current = strtok_s(lineBuffer, "\n", &lineBuffer);
        strcpy_s((movies + i)->genre, 512, current);

        printf("ID: %d\nScore: %.2lf\nTitle: %s\nYear: %d\nActors: %s\nGenre: %s\n\n", i + 1, (movies + i)->score, (movies + i)->title, (movies + i)->year, (movies + i)->actors, (movies + i)->genre);
    }

    free(lineBuffer);
    free(current);
    fclose(inputFile);
    return;
}

我在 main 中分配了我的电影数组:

int main()
{
    movie* movies = (movie*)calloc(sizeof(movie), numberOfMovies);
    for (int i = 0; i < numberOfMovies; i++)
    {
        (movies + i)->title = (char*)calloc(sizeof(char), 512);
        (movies + i)->actors = (char*)calloc(sizeof(char), 512);
        (movies + i)->genre = (char*)calloc(sizeof(char), 512);
    }

    readMoviesFromCSV(movies);
    // free(movies);
    return 0;
}

这里可能有什么问题?

【问题讨论】:

  • @user3121023 我解决了这个问题,但仍然没有解决问题。当我注释掉所有 free();语句和 fclose();程序没有给出断言失败但它没有返回值,它只是发出声音并停止。
  • 好吧,strtok_s 确实改变了 lineBuffer。调用 strtok_s 后,lineBuffer 指向在分界符之前的所有内容后剩下的部分字符串,在本例中为“,”。

标签: c visual-studio error-handling runtime-error


【解决方案1】:

至少这一行是错的:

movie* movies = (movie*)calloc(sizeof(movie), numberOfMovies);

参数顺序错误。要修复,请将其更改为:

movie* movies = (movie*)calloc( numberOfMovies, sizeof(movie) );

【讨论】:

  • 这不是问题。
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2016-07-21
相关资源
最近更新 更多