zoukankan      html  css  js  c++  java
  • gcc编译器局部变量在栈中的内存分配

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

      之前曾经发现在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 <stdio.h>
     3 #include <string.h>
     4 int main(void)
     5 {
     6     char s[4] = {}; 
     7     char s2[4] = {}; 
     8     printf("&s = %p
    ", &s);
     9     printf("&s2 = %p
    ", &s2);
    10     strcpy(s, "abcd1234");
    11     printf("%s
    ", s); 
    12     printf("%s
    ", s2);
    13     return 0;
    14 }
    gcc4.6.3中局部变量地址分配
     1 // gcc4.4.7中内存的问题
     2 #include <stdio.h>
     3 #include <string.h>
     4 int main(void)
     5 {
     6     char s[4] = {}; 
     7     char s2[4] = {}; 
     8     printf("&s = %p
    ", &s);
     9     printf("&s2 = %p
    ", &s2);
    10     strcpy(s2, "abcd1234");
    11     printf("%s
    ", s); 
    12     printf("%s
    ", s2);
    13     return 0;
    14 }
    gcc4.4.7中局部变量地址分配

      

  • 相关阅读:
    时隔三个月,不言谢归来了。学习播客继续更新日常所学。
    一个网易云音乐的外链URL简单的获取方法
    VisualStudioCode常用主题,与插件设置
    页面a标签统一跳转方法:base 标签
    Web前端开发规范(记录一):团队约定-基本原则
    JS中,正则表达式:match(/^(.*)(.)(.{1,8})$/)[3]分析
    Morgan模块使用
    Config模块使用
    MongoDB安装
    JSP-九大内置对象
  • 原文地址:https://www.cnblogs.com/itit/p/3463443.html
Copyright © 2011-2022 走看看