没有字符串数组崩溃 "A heap has been corrupted"

free of array of strings crashes with "A heap has been corrupted"

此 C 程序读取一个文件,每行一个单词。我想计算文件的唯一字数并将其存储在 totalwords 中,它通过调用函数的引用传递。 该程序创建一个字符串数组来存储尚未阅读的单词。 还有一个函数,很简单,就是检查一个单词是否已经包含在字符串数组中,叫做isContained(),请看文末post。 一切似乎都正常,我什至检查了单词是否作为唯一单词始终存储在数组中。但是,当释放数组时,出现“堆已损坏”错误并且程序崩溃。 对不起,如果这是一个新手问题,但我仔细检查了一下,但找不到错误所在。

非常感谢

评论后进行的更正(抱歉,为了 post 示例,我不得不清理原始代码的某些部分): @Some programmer dude,@ryyker,@kiran biradar,@mlp:我删除了重复的 line 声明并在末尾添加了 free(line) 。我还为字符串终止保留了 space。 numrecords 已被删除(这是为了澄清而删除的原始代码的一部分)。我正在使用 Visual Studio 2019,在调试模式下没有出现错误,只有 4 个警告。也许我做错了什么。 删除了 sizeof(char).

谢谢大家。我再次检查。这是由于字符串的另一个 malloc 没有额外的终止字符。问题解决了。 非常感谢!

int fileProcessing(char* file_in, int* totalwords) {

    FILE* streamVec;
    char* line = malloc(200);
    int i=0;    
    int numberoflines=1000;
    char** currentList = malloc(numberoflines* sizeof(char*));
    int linelength = 500; //arbitrary value to assure that lines are read completely    

    
    streamVec = fopen(file_in, "r"); 
    if (streamVec == NULL) {
        printf("*** ERROR: Could not open file: %s\n", file_in);
        return 1;
    }

    *totalwords = 0;

    while (fgets(line, linelength, streamVec) != NULL) {      //New line read from the file

                if ( ! isContained(line, currentList, *totalwords)){ //check if the word is already in the list
                        currentList[*totalwords] = malloc(strlen(line) * (sizeof(char)+1));
                        strcpy(currentList[*totalwords], line); 

                        (*totalwords)++;    
                }   
                
    } //End of the read loop

    fclose(streamVec);      

    for (i = 0; i < *totalwords; i++) {
        printf("%i %s\n", i, currentList[i]);       
        free(currentList[i]);       
    }
    free(currentList);
}
int isContained(char* mystring, char** arrayofstring, int arraylength) {

    int i;
    for (i = 0; i < arraylength; i++) {

        if (strcmp(arrayofstring[i], mystring) == 0) {
            return 1;
        }               
    }   
    return 0;
}

您发布的代码可以编译,但在 run-time 处失败。调试器注释并定位到此位置的第一个故障:

...

内存分配似乎是罪魁祸首。

以下是一些建议,以及指向可能对以下建议有帮助的一两个代码片段的链接。

问题陈述:

  • 从文件中读取单词列表(每行一个单词排列)到单词数组中。
  • 计算数组中 distinct/unique 个单词的列表。

任务列表:

  • 从原始文件中获取字数。
  • 从原始文件中获取最长单词的长度。
  • 创建存储以包含原始文件中的单词列表。
    使用前两步收集的信息。)
  • 将原始文件中的单词读入完整的单词数组。
  • 对整组单词进行排序。 (这是可选的。)
  • 使用 isContained() 函数遍历排序的完整数组以计算 unique/distinct 个单词列表。

一些建议的参考帖子:

Get count of words from file。 (这可以适应从文件中获取最长的单词。)
Create storage arrays.
(同样,可选步骤。)

currentList[*totalwords] = malloc(strlen(line) * (sizeof(char)+1));

此行不正确。 应该是:

currentList[*totalwords] = malloc((strlen(line) + 1) * sizeof(char));

为了给 null-termination 添加额外的字节。