1.基本数据类型在内存中存储的细节
- 在变量内存分析与sizeof运算符一节中,已经简单介绍了变量在内存中存储的一些规则,下面通过一个🌰来具体分析
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每个字节分别是怎么存储的,高位存储在偏大的内存地址中还是偏小的内存地址中
![](https://img.haomeiwen.com/i8442439/3700773cdb4d7ae6.png)
![](https://img.haomeiwen.com/i8442439/24664f11fee1e17e.png)
- 为了研究这个问题,直接上代码
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}; 在内存中具体的存储细节应该是图三样子的.
图三
网友评论