以前不是很熟悉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
确实很神奇怪,之后经过一番分析,发现程序的栈使用情况如下:
![C语言中栈的使用 - vanpire110 - vanpire110的博客](http://img241.ph.126.net/Ua2Vhe1OG7WfxLYcubg97w==/2196349243274760600.jpg)
故打印情况如上所示。
再来一个程序:
#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语言中栈的使用 - vanpire110 - vanpire110的博客](http://img66.ph.126.net/HjeEGs2O7HqBYMIS43NCVQ==/841610180366804297.png)
这次栈的使用情况如下:
![C语言中栈的使用 - vanpire110 - vanpire110的博客](http://img.ph.126.net/Kzbu_NwZAkZO83_p-Nc6_g==/3218947833664856170.jpg)
C打印出6789是因为被b覆盖导致的,而字符串的输出是碰到\0就结束的,故原因在此。