数组不溢出(C语言)

Array doesn't overflow (C language)

如果我尝试 运行 此代码并给出例如 "Hello"(超过 3 个字符)作为 scanf 的输入,数组 str 不会溢出。这对我来说听起来有点奇怪,但我当然遗漏了一些东西。有谁知道这里有什么问题?非常感谢!

char str[3];
scanf("%s", str);
printf("%s\n", str);

我试过 运行 你的代码,但它出现段错误:

./main 
ofejnhofewnhouwnofwbeqofenoifwenofwenoubwuiowgebouwegfougewfnbnbboue
ofejnhofewnhouwnofwbeqofenoifwenofwenoubwuiowgebouwegfougewfnbnbboue
Segmentation fault (core dumped)

我不知道你试图在 scanf() 中传递多少个字符,但你必须知道有时编译器会在保存的 ESP/EIP 和初始变量之间执行填充。

特别是,在这里,您在堆栈上创建了一个 3 字节的内存区域,编译器首先会将其四舍五入为 4(或者在 x64 上为 8?)。但即便如此,它可能会增加更多 space.

gdb中,一个disass main给我:

   0x000000000040057d <+0>: push   %rbp
   0x000000000040057e <+1>: mov    %rsp,%rbp
   0x0000000000400581 <+4>: sub    [=11=]x20,%rsp

sub 0x20 是 32 个字节,显然超过 3 个字节。

不要指望严格的 "dummy" C 到汇编器指令,现在编译器执行的优化和决策比您可能意识到的要多。

尝试找到缓冲区和 EIP 之间的确切字节范围通常需要执行暴力破解,但聪明的黑客可能会找到更有趣的方法...;-)

C 运行时不会发出 error/warning 消息,但会产生不正确的结果。 检查 Overflow/Underflow 是您的责任。

你说,"the array str doesn't overflow",但你怎么知道的?您期望溢出如何表现出来?

事实上,数组确实溢出了。您刚刚获得 "lucky",并且没有(可见的)影响。

理解计算机编程的一个棘手问题是规则的执行可能非常不一致。 (计算机编程在这方面与生活并无二致。)如果十字路口的信号灯显示 "Don't Walk",但没有汽车驶来,所以你还是过马路,如果没有警察立即出现并给你写信,你会有多惊讶乱穿马路的罚单?这基本上就是这里发生的事情。