我跑在Mac此代码,也可以在Linux:这个字符串怎么没有溢出缓冲区?
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[]){
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one");
strcpy(buffer_two, "two");
printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[BEFORE] value is at %p and is %i (0x%08x)\n", &value, value, value);
printf("\n[STRCPY] copying %i bytes into buffer two\n\n", strlen(argv[1]));
strcpy(buffer_two, argv[1]);
printf("[AFTER] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[AFTER] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[AFTER] value is at %p and is %i (0x%08x)\n", &value, value, value);
}
在Mac上,如果我进入了“1234567890”作为命令行参数,90溢出到缓冲区中的一个,因为我所期望的,因为缓冲区8个字节由2
但是,如果我在我的Linux系统上运行它突破,它需要更多的字符缓冲区溢出。怎么来/为什么我可以放弃在Linux中缓冲缓冲区?
另外作为边注,在两个系统中,整个字符串将仍然在缓冲器两个印刷并仅在一个缓冲器溢出的物品。为什么会发生?剩下的角色怎么会不会进入下一个?如果这个问题表达不好,继承人一个例子:
如果我在我的mac上输入1234567890,1234567890将打印在缓冲区二,90将打印在缓冲区一。即使已经溢出了,90如何仍然能够放入缓冲区2中。 (它是在Linux上相同的概念,但它需要超过10个字节溢出)