您的位置:首页 > 其它

栈中变量地址分配

2013-05-27 17:01 357 查看
#include <stdio.h>
#include <string.h>

int main()
{
int x=35;
char str[10];
strcpy(str,"123456789abc");
printf("%d\n",x);
return 0;
}

结果输出0。

为什么会这样呢?因为栈中是从高地址到低地址的顺序压栈,也就是说先压栈的变量x的地址要比后压栈的字符数组str的地址要高,我们可以将其地址打印出来:

printf("%x\n",&x); //12ff44

printf("%x\n",&str[0]); //12ff38

printf("%x\n",&str[9]); //12ff41

我们可以看到变量x的地址要比数组str地址要高。其实,栈中布局如下图所示



首先给变量分配4字节空间,从12ff44到12ff47,由低位到高位依次分配;之后,给字符数组str分配10个字节空间,由于需要数据对齐,所以需要空出两个字节用于保证数据对齐,所以把12ff38到12ff41的空间分配给字符数组。

当我们将"123456789abc"赋值给字符数组str时,由于str只有10个字符空间,而"123456789abc"占13个空间(包括\0),所以会造成数组溢出,溢出的b会占据12ff42空间,溢出的c会占据12ff43空间,溢出的'\0'会占据12ff44空间,而12ff44本来是存贮变量x的低8位,现在被\0重新赋值,所以变量x会变成0。

将程序修改一下,看看输出什么

#include <stdio.h>
#include <string.h>

int main()
{
int x=35;
char str[10];
strcpy(str,"123456789ab");//从原来占13个字符空间变为占12个字符空间
printf("%d\n",x);
return 0;
}


结果输出35。

因为数组溢出的b会占据12ff42空间,溢出的\0会占据12ff43空间,溢出的数据并没有影响到变量x的存储空间,所以变量x正常输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: