c语言中的fread怪异行为

c语言中的fread怪异行为,c,buffer,C,Buffer,我写了一段代码只是为了理解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); } #包括 #包括 void mai

我写了一段代码只是为了理解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);
}
#包括
#包括
void main(){
char spool[5]=“你好”;
fread(spool,sizeof(char),6,stdin);//stdin==“你好”
printf(“\n%s\n”,假脱机);
}

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

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


增加数组
假脱机的大小以容纳所需的字符

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

char spool[5]=“你好”

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

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


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

那么您将六个字符读入一个只能包含五个字符的数组?您需要阅读。还要记住,所有字符串都必须终止,如果您不添加终止符,那么您将出现另一种UB(未定义行为)。旁白:请注意
sizeof(char)
定义为
1
。而且,
fread()
返回读取的字节数-非常有用。事实上,我的常识告诉我,通常当我尝试将6字符串放入spool时,我会得到一个编译错误,这就是当我请求10字符串时发生的情况。@jehutyy编译器无法提前知道在运行时要键入什么。即使它知道,也无法阻止它。C的主要优点是可以自由地做任何你想做的事情,几乎没有限制。同时,如果你不知道自己在做什么,那么很容易产生错误。想知道为什么这没有得到任何投票(有时很糟糕)。那个
hello
部分很受关注。加一。
#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