美文网首页
数组内存存储的细节

数组内存存储的细节

作者: SimpleSJ | 来源:发表于2018-10-26 15:51 被阅读0次

1.基本数据类型在内存中存储的细节

    char oip = 'r';
    int intValue = 5;
    char iop = 'w';
    
    printf("oip内存地址-------------%p\n",&oip);
    printf("intValue变量的内存地址 ---- %p\n",&intValue);
    printf("iop内存地址-------------%p\n",&iop);
//输出:
oip内存地址-------------0x7ffeefbff52f
intValue变量的内存地址 ---- 0x7ffeefbff528
iop内存地址-------------0x7ffeefbff527
  • 这里会不会产生一个疑问?当我写到这里时有产生一个疑问,为什么intValue与oip之间的字节间隔不是4?不是说在64位编译器下int占4个字节吗?这里占了不止4个字节吧.为什么呢? (我所使用的环境是:64位系统,Xcode的clang编译器)
    猜想:难道变量在内存中分配的内存地址是不连续的?
  • 于是乎经过自己的一顿分析无果后,果断去网上找答案了 - - #,最终功夫不负有心人,最终在这里找到了答案!
    说法一:局部变量在栈上的排列次序是c语言标准中没有规定的内容
    说法二:为了提高效率的变量对齐
    说法三:因为编译器为了防止他人推算出函数的返回地址从而进行修改,使用了栈随机化技术。主要是为了防止软件被攻击的一种策略

总而言之:明确了一点,两个连续定义的变量内存地址之间的间隔,是编译器控制的,没有固定规律

  • 当然这不是我们分析的重点,我们要分析一下这个intValue每个字节分别是怎么存储的,高位存储在偏大的内存地址中还是偏小的内存地址中
图一 图二
  • 为了研究这个问题,直接上代码
int intValue = 5;
    printf("intValue地址: --- %p\n",&intValue);
    char *p = &intValue;
    size_t length = sizeof(int)/sizeof(char);
    for (int i = 0; i < length; i ++) {
        printf("当前内存地址 %p --- \n",p+i);
        printf("当前地址中存储的值----%i\n",*(p+i));
    }
//输出:
intValue地址: --- 0x7ffeefbff528
当前内存地址 0x7ffeefbff528 --- 
当前地址中存储的值----5
当前内存地址 0x7ffeefbff529 --- 
当前地址中存储的值----0
当前内存地址 0x7ffeefbff52a --- 
当前地址中存储的值----0
当前内存地址 0x7ffeefbff52b --- 
当前地址中存储的值----0

由此可证:图一是 intValue在内存中的具体存储情况

2.数组内存存储的细节

话不多说,上代码

int nums[] = {5,9};
    printf("nums内存地址:---%p\n",&nums);
    printf("nums内存地址:---%p\n",nums);
    printf("nums内存地址:---%p\n",&nums[0]);
    printf("nums内存地址:---%p\n",&nums[1]);
//输出
nums内存地址:---0x7ffeefbff530
nums内存地址:---0x7ffeefbff530
nums内存地址:---0x7ffeefbff530
nums内存地址:---0x7ffeefbff534

结合我们上面得出的int类型在内存中的存储方式,得出结论

结论1:&nums=nums=&nums[0],nums就是数组的地址
结论2: int nums[] = {5,9}; 在内存中具体的存储细节应该是图三样子的.


图三

相关文章

  • 笔记:数组的内存分配 , 排序算法,数组和函数之间的关系

    #mark- 01-数组内存存储细节 //问题:变量和数组在内存中存储的区别? 注意作图分析内存 1.变量在内存中...

  • C语言day07-01数组-内存存储细节

    pragma mark 数组-内存存储细节 pragma mark 概念 pragma mark 代码

  • 数组内存存储的细节

    1.基本数据类型在内存中存储的细节 在变量内存分析与sizeof运算符一节中,已经简单介绍了变量在内存中存储的一些...

  • 第07天C语言(00):笔记总结

    01-数组-内存存储细节 02-数组-注意点 03-数组-练习1 04-函数和数组1 05-数组和函数2 06-数...

  • Day08

    二维数组 二维数组格式 二维数组初始化 二维数组的遍历 二维数组内存存储细节 二维数组与函数注意点: 主要是看函数...

  • 数组注意点

    数组在内存中的存储 变量的内存寻址是从大到小,所以存储数据时会从高字节开始存储 数组存储的和变量相反,元素存储是从...

  • note_17.1_shell数组、bash字符串操作

    shell脚本编程 变量:存储单个元素的内存空间;数组:存储多个元素的连续的内存空间;├── 数组名:整个数组只有...

  • 『数据结构与算法』—— 链表

    底层存储结构 与 数组 对比,数组需要一块 连续的内存空间 来存储,对内存要求很高。如果我们申请 50MB 的内存...

  • 内存存储细节

    堆区: 类对象(方法列表), 实例对象(isa指针, 属性列表) 栈区:指针 类方法比实例方法执行效率高

  • 数组

    1.数组 ① 变量:存储单个元素的内存空间② 数组:存储多个元素的连续的内存空间,相当于多个变量的集合③ 数组名和...

网友评论

      本文标题:数组内存存储的细节

      本文链接:https://www.haomeiwen.com/subject/xbsktqtx.html