没有字符串数组崩溃 "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 添加额外的字节。
此 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 添加额外的字节。