在c中发现奇怪的行为

时间:2015-05-06 14:15:03

标签: 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);
}

首先,我认为线轴的价值将被&#34; bonjo&#34;但我得到了&#34; bonjou&#34;。我不明白为什么我得到一个6个字符的字符串而不是一个5个字符的字符串。

3 个答案:

答案 0 :(得分:1)

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

#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

答案 1 :(得分:1)

  

char spool [5] =“hello”;

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

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

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

答案 2 :(得分:0)

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

增加数组spool的大小以保存所需的字符。