关于定义顺序和内存分配的关系--记一道不严谨的C语言题
2017-06-09 22:15
302 查看
include<stdio.h> #include<iostream> int main() { char a[] = "123"; char b[] = "abcd"; if (a > b) { printf("a>b \n"); } else printf("a<b\n"); printf("%p\n %p\n", a, b); system("pause"); }
就是这么一道题目,问你最终输出的是a>b还是a<b,答案是a>b。
我一看,这a和b比的是啥啊,如果是按照strcmp()方法来比,那肯定a<b啊,那显然不是,那么应该是比的指针地址大小,可是这玩意儿不是随机分配的吗,难道是我的姿势水平还不够?所以我就开始尝试了。
首先这段代码在是vs2017debug模式运行起来确实是a>b,和题目的答案一样。
![](https://images2015.cnblogs.com/blog/1129935/201706/1129935-20170609221112590-1914753686.png)
,但是一旦我们把a和b的定义先后顺序换一下,也就是
#include<stdio.h> #include<iostream> int main() { char b[] = "abcd"; char a[] = "123";//调换了一下a,b定义的位置 if (a > b) { printf("a>b \n"); } else printf("a<b\n"); printf("%p\n %p\n", a, b); system("pause"); }
答案就变成了 a<b,这是玄学吗?先定义的地址比较大?那我就不能喷这个题目了。
![](https://images2015.cnblogs.com/blog/1129935/201706/1129935-20170609221210825-1760671953.png)
因为不是这样的,同样是最初的那段代码,当我们把debug换成release时,发现结果恰恰相反,变成了a<b。
![](https://images2015.cnblogs.com/blog/1129935/201706/1129935-20170609221009012-1135754263.png)
这道题目有问题啊,不够严谨,实际上,C语言对编译器对于内存地址的分配顺序并没有硬性规定,从编译器的角度来说,变量的地址是可以随机安排的,又不影响寻址使用,不一定非要按排列顺序。不同编译器的分配方式不同。举个例子,在vs的debug模式下,先定义的地址比较大,后定义的地址比较小,而在release模式下则正相反。今天也算是涨姿势了,学习一个。
相关文章推荐
- C\C++编译器关于变量的内存分配顺序总结
- C语言中的全局变量内存分配和初始化顺序
- C\C++编译器关于变量的内存分配顺序总结
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- 关于构造函数析构函数以及成员变量内存分配顺序的一些问题
- 数据结构 学习笔记之:关于顺序栈中给结构体类型指针分配内存时,使用malloc和不使用malloc的疑惑之解惑!
- C语言------关于系统内存分配机制的一些整理
- 关于c语言的变量存储及内存分配
- 关于C语言中内存分配的技巧
- 关于全局变量内存分配的顺序
- c中定义变量的内存分配顺序问题(极易错!!!)
- 关于c语言内存分配的一些见解
- 一道关于内存的C语言题
- c中定义变量的内存分配顺序问题
- 一道关于内存分配的笔试题
- 关于c语言变量的存储及内存的分配
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- C\C++编译器关于变量的内存分配顺序总结
- C语言中关于内存的分配
- C语言中的全局变量内存分配和初始化顺序