你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / C专栏
关于C++内存生长
 

今天看到网上帖子说计算机中内存的生长的方式是从高地址到低地址的,很久以前就了解过这个知识点,但还是不禁写了个代码试了一下。这一试发现了更多问题。

测试代码如下:
​​​
#include <stdio.h>

struct TestType

{

    int _a; 

    int _b; 

};


int main()

{

    int a = 1;

    struct TestType testa;

    int b = 4;

    testa._a = 2;

    testa._b = 3;

    int c1 = 5, c2 = 6, c3 = 7;

    int d[10];

    printf("a = %p,\n", &a);

    printf("testa = %p,\n", &testa);

    printf("b = %p,\n", &b);

    printf("c1 = %p, c2 = %p, c3 = %p,\n", &c1, &c2, &c3);

    printf("d[0] = %p, d[2] = %p\n", &d[0], &(d[2]));

    return 0;

}

GDB调试结果如下:

​​

 

这个结构体和int变量中间多了4字节的奇怪玩意儿,不晓得是神马鬼,然后调整了struct定义的位置,发现每次struct变量出现的位置总是在每16个字节的开始位置。比如说例子中的testa前面这样定义的话:

int a;

int b;

TestType testa;

那么testa的分布就会变成这样:


a = 0x7fff54ac4be8,
b = 0x7fff54ac4be4,
testa = 0x7fff54ac4bd0,

还没搞明白为什么。(测试环境:macos x 10.10.4,gcc版本4.9.2)


然后又去VS下测试了一下,发现windows下确实是高地址向低地址顺序生长的,但是VS下也有奇怪的现象,每个变量的开始和结束都会有4字节的cc值,不知道是干什么的。

 

这些应该都是编译器的设计,但是不太了解这样的意图,如果有高人知道以上两点,希望能给予指导,不胜感激!
---------------------
作者:knight3396
来源:CSDN
原文:https://blog.csdn.net/knight3396/article/details/47863651
版权声明:本文为博主原创文章,转载请附上博文链接!

  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089