博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gcc编译器局部变量在栈中的内存分配
阅读量:4564 次
发布时间:2019-06-08

本文共 1235 字,大约阅读时间需要 4 分钟。

  内存分配,根据系统与编译器的不同,差别很大。

  之前曾经发现在ubuntu12.04系统gcc 4.63版本编译器,先定义的局部变量在栈中地址低,而后定义的局部变量在栈中地址高,与认知有差别。试了多个系统与编译器,最后发现与linux发行版关系不大,而与gcc的版本有关。在gcc4.4.7版本和4.8.0版本中,栈中的内存地址分配“正常”。

  今天又因为一个问题,对这个问题进行了进一步的探索。

  试验之后,得到如下的大致结论。

  gcc 4.47 ubuntu 12.04环境中,在栈中定义多个变量时:

    同类型的,单元素数组按单元素算。从高到低,从元素到数组(数组在低地址)。

    不同类型的,要考虑对齐与补齐。整体上,短类型的在高地址上。

   gcc 4.63 ubuntu 12.04环境中,在栈中定义多个变量时:

    同类型的,单元素数组按单元素算。从低到高,数组在低地址。

    不同类型的,要考虑对齐与补齐。整体上,短类型的在高地址上。

 

附两个代码,区别只在strcpy的参数上。如果用gcc4.6.3编译第二个版本,执行时会报错:stack smashing detected

1 // gcc4.6.3中内存的问题 2 #include 
3 #include
4 int main(void) 5 { 6 char s[4] = {}; 7 char s2[4] = {}; 8 printf("&s = %p\n", &s); 9 printf("&s2 = %p\n", &s2);10 strcpy(s, "abcd1234");11 printf("%s\n", s); 12 printf("%s\n", s2);13 return 0;14 }
gcc4.6.3中局部变量地址分配
1 // gcc4.4.7中内存的问题 2 #include 
3 #include
4 int main(void) 5 { 6 char s[4] = {}; 7 char s2[4] = {}; 8 printf("&s = %p\n", &s); 9 printf("&s2 = %p\n", &s2);10 strcpy(s2, "abcd1234");11 printf("%s\n", s); 12 printf("%s\n", s2);13 return 0;14 }
gcc4.4.7中局部变量地址分配

 

  

转载于:https://www.cnblogs.com/itit/p/3463443.html

你可能感兴趣的文章
在 OC 中调用 Swift 代码
查看>>
Android仿腾讯应用宝 应用市场,下载界面, 有了进展button
查看>>
AngularJS之ng-class(十一)
查看>>
安卓|五大逆向软件下载
查看>>
Junit使用第二弹
查看>>
软件测试技术---代码检查,走查与评审
查看>>
常用 Header 简单讲解和优先级顺序
查看>>
Android开发EditText属性
查看>>
Windows10设置
查看>>
HDU 2177——威佐夫博弈
查看>>
rsync+sersync实现代码同步
查看>>
[TYVJ1827]『Citric II』一道防AK好题
查看>>
poj 2785(折半枚举+二分搜索)
查看>>
Matrix4x4
查看>>
PHP7新功能及语法变化总结
查看>>
如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例
查看>>
Python正则表达式初识(三)
查看>>
java step1:基础知识4
查看>>
qbzt day1 上午
查看>>
Java——参数传递
查看>>