Arrays 没有字符串数组,并使用“0”;堆已损坏";

Arrays 没有字符串数组,并使用“0”;堆已损坏";,arrays,c,string,free,Arrays,C,String,Free,这个C程序读取每行一个字的文件。我想计算文件的唯一字数并将其存储在totalwords中,totalwords通过调用函数的引用传递。 程序创建一个字符串数组来存储已经读取的单词。 还有另一个非常简单的函数,它检查字符串数组中是否已经包含一个单词,称为isContained(),请参见本文末尾。 所有这些似乎都正常工作,我甚至检查了这些单词是否作为唯一的单词一致地存储在数组中。但是,释放阵列时会出现错误“堆已损坏”,程序会崩溃。 很抱歉,如果这是一个新手问题,但我仔细检查了一下,找不到错误所在

这个C程序读取每行一个字的文件。我想计算文件的唯一字数并将其存储在totalwords中,totalwords通过调用函数的引用传递。 程序创建一个字符串数组来存储已经读取的单词。 还有另一个非常简单的函数,它检查字符串数组中是否已经包含一个单词,称为isContained(),请参见本文末尾。 所有这些似乎都正常工作,我甚至检查了这些单词是否作为唯一的单词一致地存储在数组中。但是,释放阵列时会出现错误“堆已损坏”,程序会崩溃。 很抱歉,如果这是一个新手问题,但我仔细检查了一下,找不到错误所在

提前多谢

评论后所做的更正(很抱歉,我必须清理原始代码的某些部分以发布示例): @一些程序员伙计,@Ryker,@kiran biradar,@mlp:我删除了重复的行声明,并在末尾添加了空闲(行)。我还为字符串终止保留了空间。numrecords已被删除(这是为了澄清而删除的原始代码的一部分)。我使用的是Visual Studio 2019,调试模式下没有出现错误,只有4条警告。可能我做错了什么。 已删除sizeof(字符)

谢谢大家。我再次检查。这是由于没有附加终止字符的字符串的另一个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文件处理(char*file\u in,int*totalwords){
文件*streamVec;
char*line=malloc(200);
int i=0;
int numberoflines=1000;
char**currentList=malloc(numberoflines*sizeof(char*);
int linelength=500;//确保完全读取行的任意值
streamVec=fopen(文件在“r”中);
如果(streamVec==NULL){
printf(“***错误:无法打开文件:%s\n”,文件\u在);
返回1;
}
*totalwords=0;
while(fgets(line,linelength,streamVec)!=NULL){//从文件中读取新行
如果(!isContained(line,currentList,*totalwords)){//检查单词是否已在列表中
currentList[*totalwords]=malloc(strlen(line)*(sizeof(char)+1);
strcpy(当前列表[*totalwords],行);
(*总字数)+;
}   
}//读取循环结束
fclose(streamVec);
对于(i=0;i<*totalwords;i++){
printf(“%i%s\n”,i,currentList[i]);
自由(当前列表[i]);
}
免费(当前列表);
}
int包含在内(char*mystring,char**arrayofstring,int arraylength){
int i;
对于(i=0;i
您发布的代码经过编译,但在运行时失败。调试器对此位置注释并定位了第一个失败:


内存分配似乎是罪魁祸首

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

问题陈述:

  • 将文件中的单词列表(按每行一个单词排列)读入单词数组
  • 从数组中计算不同/唯一单词的列表
任务清单:

  • 从原始文件中获取字数
  • 从原始文件中获取最长单词的长度
  • 创建存储以包含原始文件中的单词列表。
    (使用前两步中收集的信息。)
  • 将原始文件中的单词读入完整的单词数组
  • 对单词的完整数组进行排序。(这是可选的。)
  • 使用
    isContained()
    函数循环排序的完整数组,以计算唯一/不同的单词列表
一些建议的参考员额:

(这可以调整为从文件中获取最长的单词。)


(同样是可选步骤。)

您发布的代码经过编译,但在运行时失败。调试器对此位置注释并定位了第一个失败:


内存分配似乎是罪魁祸首

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

问题陈述:

  • 将文件中的单词列表(按每行一个单词排列)读入单词数组
  • 从数组中计算不同/唯一单词的列表
任务清单:

  • 从原始文件中获取字数
  • 从原始文件中获取最长单词的长度
  • 创建存储以包含原始文件中的单词列表。
    (使用前两步中收集的信息。)
  • 将原始文件中的单词读入完整的单词数组
  • 对单词的完整数组进行排序。(这是可选的。)
  • 使用
    isContained()
    函数循环排序的完整数组,以计算唯一/不同的单词列表
一些建议的参考员额:

(这可以调整为从文件中获取最长的单词。)

(也是可选步骤。)

这行不正确。 应该是:

currentList[*totalwords] = malloc((strlen(line) + 1) * sizeof(char));
以便为空终止添加额外字节

这行不正确。 应该是:

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

为了添加空终止的额外字节。

为什么强制转换
malloc(((双)线宽))
?在初始化
行时分配的内存会发生什么情况呢?
?至于您的问题,请记住,在C中字符串实际上被称为以null结尾的字节数组。您必须记住也要为null结尾符分配空间。
currentList[*totalwords]=malloc(strlen(line)*sizeof(char);
-->
currentList[*totalwords]=malloc(strlen(line)*sizeof(char)+1);
Make s
currentList[*totalwords] = malloc((strlen(line) + 1) * sizeof(char));