以前不是很熟悉C语言中栈的使用,只知道是栈是从高地址到低地址增长,但是下面这个程序确实让人咋舌。
程序如下:
#include <string.h>
#include <stdio.h>
int main()
{
char a[] = "123456789";
char b[] = "1234";
strcpy(b, a);
printf("b = %s a = %s\n", b, a);
return
}
执行结果:
b = 123456789 a = 6789
确实很神奇怪,之后经过一番分析,发现程序的栈使用情况如下:

故打印情况如上所示。
再来一个程序:
#include <string.h>
#include <stdio.h>
int main()
{
char a[] = "123456789";
char c[] = "aaaaaaaaaaaaaaaaaaaa";
char b[] = "1234";
strcpy(b, a);
// printf("%x %x %x\n", a, c, b); // %x 这些是地址打印情况
// printf("%x %x %x\n", &a[0], &c[0], &b[0]);
// printf("%x %x %x\n", &a[8], &c[19], &b[4]);
// printf("%c %c %c\n", a[0], c[0], b[0]);
// printf("%c %c %c\n", a[8], c[19], b[4]);
printf("b = %s a = %s c = %s\n", b, a, c);
return 0;
}
执行情况如下:

这次栈的使用情况如下:

C打印出6789是因为被b覆盖导致的,而字符串的输出是碰到\0就结束的,故原因在此。