为什么堆栈被破坏了?

int compare_chars(const void* a, const void* b) { char* c1 = (char*)a; char* c2 = (char*)b; return *c1 - *c2; } int main(int argc, char* argv) { FILE* file = fopen("c:\\file.txt", "r"); assert(file != NULL); char word[10] = { 0 }; while (!feof(file)) { fscanf(file, "%s", &word); qsort(word, 10, sizeof(char), &compare_chars); for (int i = 0; i < 10; i++) printf("%c", word[i]); printf("\n"); } fclose(file); } 

我收到以下消息:

运行时检查失败#2 – 变量’word’周围的堆栈已损坏。

它发生在仅包含“0123456789”(10个字符)的有效文件中。

为什么?

fscanf声明中 –

  fscanf(file, "%s", &word); ^not needed (remove &) 

char word[10] = { 0 };

字符串以null terminated 。 因此,增加数组word大小以包括'\0'

while (!feof(file))是错误的。

编辑

相反,你可以用fscanf控制循环 –

 while(fscanf(file, "%s", word)==1){ // your code } 

因为成功完成后, fscanf将返回成功匹配和分配的输入项的数量。

在您的情况下, fscanf将在成功时返回1

c中的字符串以空值终止,因此您需要为字符串终止符分配空间。

要适合10个字符长的单词,您需要分配11个字节:

 char word[11] = { 0 }; 

一个10个字符的字符串需要11个字符来表示(最后一个空字节的1个字符)。