为什么堆栈被破坏了?

时间:2015-08-14 14:33:25

标签: c

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个字符)的有效文件上。

为什么?

3 个答案:

答案 0 :(得分:4)

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

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

char word[11] = { 0 };

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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