害怕 c 中的奇怪行为

fread weird behavior in c

我写了一段代码只是为了了解 fread 的工作原理,但我不明白这是怎么可能的。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

void main(){
    char spool[5] = "hello";
    fread(spool, sizeof(char), 6, stdin); //stdin == "bonjour"
    printf("\n%s\n", spool);
}

所以首先,我认为 spool 的值会被 "bonjo" 取代,但我得到了 "bonjou"。我不明白为什么我得到一个 6 个字符的字符串而不是 5 个字符的字符串。

你所拥有的是未定义的行为。您正在尝试将 6 个字符读入一个可以容纳 5 个字符的数组 characters.Please 请注意,该数组应该足够大以容纳一个 nul 终止符。

增加数组的大小spool以容纳所需的字符。

您需要增加 spool 缓冲区的大小,(它不能存储超过 5 chars,这会导致未定义的行为):

#include <stdio.h>
#include <stdlib.h>

int main(){
    char spool[15] = "hello";
    fread(spool, sizeof(char), 6, stdin); //stdin == "bonjour"
    printf("\n%s\n", spool);
}

输出:

bonjou

char spool[5] = "hello";

这是错误的,因为 C 中的字符串以 null 结尾。您不为空终止分配 space 。一个体面的编译器应该给你一个警告。 (显然 gcc 甚至没有使用 -Wall -Wextra,所以那很糟糕)。

将 "bounjour" 读入该数组也是错误的,因为 C 数组没有边界检查,也没有任何库函数。因此,如果您尝试在数组中存储比可用空间更多的数据,您将在数组边界之外写入,并且程序将(希望)崩溃。您调用未定义的行为,所以任何事情都可能发生。

通过声明一个足够大的数组来解决这个问题,并研究字符串的空终止。