我目前收到以下错误
Process terminated with status -1073741819
我怀疑它是fgets()
,但我不知道为什么会这样,任何帮助都会非常感激。
//Gets Dictionary from file
char* GetDictionary() {
int ArraySize;
int i = 0;
FILE * DictionaryFile;
//Gets first line (in this case it is the amount of Lines)
DictionaryFile = fopen("dictionary.txt", "r");
fscanf(DictionaryFile,"%d", &ArraySize);
ArraySize = ArraySize + 1;
printf("%d", ArraySize);
fclose(DictionaryFile);
//Gets the array
char* Dictionary = malloc(sizeof(char)*ArraySize);
char Temp[ArraySize];
char TempArray[ArraySize];
DictionaryFile = fopen("dictionary.txt", "r");
while(fgets(Temp, sizeof Temp, DictionaryFile)!=NULL) {
Dictionary[i] = Temp;
//Check The array
printf("%s", Dictionary[i]);
i++;
}
fclose(DictionaryFile);
return Dictionary;
}
答案 0 :(得分:2)
-1073741819 - > C0000005并且可能具有一定的意义。也许用下面来辨别它的含义。
puts(strerror(-1073741819));
代码有很多问题:这些问题已得到纠正,以帮助您前进。
1)分配一个指针数组,而不是char
// char* Dictionary = malloc(sizeof(char)*ArraySize);
char** Dictionary = malloc(ArraySize * sizeof *Dictionary);
2)形成一个大缓冲区来读取每一行
char Temp[100];
3)阅读完每一行后,摆脱可能的尾随'\n'
size_t len = strlen(Temp);
if (len && Temp[len-1] == '\n') Temp[--len] = 0;
4)为该单词分配内存并保存
Dictionary[i] = malloc(len + 1);
assert(Dictionary[i]);
memcpy(Dictionary[i], Temp, len + 1);
5)强大的代码在完成之前释放它的分配
6)代码读取"行数"两次打开文件两次。只是让文件保持打开状态(而不是重新打开它)。 @user3386109
答案 1 :(得分:0)
您可能希望Dictionary
成为char字符串数组。也就是说,Dictionary
是一个数组,数组中的每个元素都是char *
。这使Dictionary
成为char **
。
对于此示例,为Dictionary
数组本身分配内存可能是最直接的,然后为其内容分配内存。当然,当你完成时,你需要释放所有这些。
char **Dictionary = malloc(sizeof(char *) * ArraySize);
for (int i = 0; i < ArraySize; i++) {
Dictionary[i] = malloc(ArraySize);
}
有更好的方法可以做到这一点。例如,对于每个fgets()
返回,您可能只在需要时分配内存。您还可以使用strdup()
仅分配所需的内存。你也可以从已经分配的来电者那里传递Dictionary
,这样你就不用担心在这里分配它了。
稍后在你的程序中,正如@WhozCraig指出的那样,你需要复制Temp中的字符串,比如strcpy(Dictionary[i], Temp)
,代替Dictionary[i] = Temp
。我也很惊讶没有生成编译器警告!