2014-10-02 74 views
0
#include <stdio.h> 

int main(void) { 
    char arr[10]; 
    gets(arr);//let's suppose input is "abcdefgshsdfhdsfsh" 
    printf("%s",arr);//output come is same as input but the allocated arr have 10 bytes memory 
         //and can store only ten characters but how come it's possible i am getting output 
         //more than 10 character 
    return 0; 
} 

输出背后的原因是什么?任何帮助,将不胜感激。任何人都可以解释为什么输出超过了内存分配?

+2

字符串最后需要'\ 0'。你在这里展示的是未定义的行为。 – 101010 2014-10-02 06:09:46

+0

@ 40two:'gets()'终止于用'\ 0''读取的数据。 – alk 2014-10-02 06:19:48

+2

在没有解释**的情况下关闭与UB的这种引用为什么**这是UB没有意义。 – alk 2014-10-02 06:21:52

回答

-3

C字符串(类型为char的数组)需要终止空字节来指示字符串的结尾。当一个字符串的字节正在被例如printf(),当空达到时,函数将停止处理这些字节。由于您超出了数组的长度(并且在任何与数组相邻的内存中,末尾的空字节已放置在远离数组起点的10个字节之外),因此函数将在未定义的字节数打印。

+0

Downvoter:小心解释为什么? – 2014-10-02 06:20:04

+1

它不是缺少的'0'终结符,它使得代码失败,因为'gets()'确实需要添加它,但缓冲区溢出,由用户通过输入超过9个字符引发。 Btw:'NULL'与'0'又名'NUL'又名'null'又名''\ 0''。 – alk 2014-10-02 06:38:01

+0

在C/C++语言的规范中,空指针可能与0不同(或更确切地说来自'(void *)0')。然而,对于空字节,它总是等于'(char)0'或''\ 0'',而不能是其他任何东西。 – SylvainL 2014-10-02 06:46:54

0

未定义的行为意味着程序没有遵循该语言的规则,并且编译器对结果行为没有任何承诺。

所以当你写过一个未定义行为的数组的末尾时,语言不会承诺它会让你知道错误。它可能似乎工作,它可能会崩溃。今天和明天可能会做一件事。

这就好比把50磅的东西放在额定容量为20磅的架子上。也许它会撑起来,也许它会立即崩溃。也许它会持续下去,直到你拿走东西,而这一切都会崩溃。

+1

未定义行为的货架类比值得+1!然而,他没有向OP_how_解释,他已经写了数组的末尾('gets()'的不安全行为)取消了这一点(为了公正地检查器-g和他的答案)。 – AAT 2014-10-13 14:12:17

2

因为get从stdin获取字节并将它们放在某处时不做任何类型的检查。一个简单的例子:

char array1[] = "12345"; 
char array2[] = "67890"; 

gets(array1); 

现在,首先你被允许输入你想有多少个字符,gets不会在意它。其次,超过你放置它们的数组大小的字节(在本例中为array1)将覆盖它们在内存中找到的任何内容,因为gets将写入它们。在前面的例子中,这意味着如果输入“abcdefghijklmnopqrts”可能会不可预知,它也会覆盖array2或其他什么。

该函数是不安全的,因为它假定输入一致。永远不要使用它!

更安全的方法是fgets()

所以,你要避免getsfgets将永远读取新行,如果缓冲区足够大,以容纳它(它可以让你知道什么时候缓冲区太小,有更多的线路等待读取)。如果您想要fgets之类的东西不会读取新行(丢失指示过小的缓冲区),则可以使用fscanf,其扫描集转换为:“%N [^ \ n]”,其中strtok(buffer, "\n");这不是如何strtok意图是:1.

一个简单的(如果怪)方式与fgets读取后除去从缓冲器后新线是 - “N”是由缓冲器大小替换使用,但我已经比预期的方式更频繁地使用它(我通常避免这种方式)。

来源:从我保存的问题中复制而来。

+0

部分来源的链接; http://stackoverflow.com/a/3302308/3747990 – Niall 2014-10-02 07:05:16

相关问题