栈中变量地址分配
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正常输出。
相关文章推荐
- 变量的地址分配
- 如何分配变量到指定的地址
- C语言中变量的地址分配
- C++中局部和全局变量的地址分配
- VS2012中自动变量的地址分配问题
- c语言 输出变量的地址,动态的观察内存的分配。
- 各类变量在内存中的地址分配
- C和VC中分配变量地址的问题
- 临时变量在内存中的地址分配
- 对于结构体,什么时候分配内存以及为什么选择用malloc函数来分配结构体变量的地址
- 堆中分配的变量地址虽有一定规律,但整体上是无规律的
- C语言数据类型大小和结构体中变量的地址分配方法【整理】
- 如何分配变量到指定的地址
- GCC编译器局部变量地址分配为什么总是从低地址向高地址增加?
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- C语言结构体变量内存分配与地址对齐
- 关于C语言给变量分配地址
- 探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别(一)
- C++有关char变量地址输出的问题
- Linux per-CPU变量分配与管理源码分析(未完)