关于定义顺序和内存分配的关系--记一道不严谨的C语言题

Posted 超立方体

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于定义顺序和内存分配的关系--记一道不严谨的C语言题相关的知识,希望对你有一定的参考价值。

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,和题目的答案一样。

 

,但是一旦我们把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,这是玄学吗?先定义的地址比较大?那我就不能喷这个题目了。

 

因为不是这样的,同样是最初的那段代码,当我们把debug换成release时,发现结果恰恰相反,变成了a<b。

 

 

这道题目有问题啊,不够严谨,实际上,C语言对编译器对于内存地址的分配顺序并没有硬性规定,从编译器的角度来说,变量的地址是可以随机安排的,又不影响寻址使用,不一定非要按排列顺序。不同编译器的分配方式不同。举个例子,在vs的debug模式下,先定义的地址比较大,后定义的地址比较小,而在release模式下则正相反。今天也算是涨姿势了,学习一个。

 

以上是关于关于定义顺序和内存分配的关系--记一道不严谨的C语言题的主要内容,如果未能解决你的问题,请参考以下文章

11,一道关于栈内存分配的题目

自定义堆/内存分配范围

关于一道习题的思考

思考题2关于C的不安全不严谨之处

记一道面试题:手写一个内存泄漏的代码,如何修正

内存分配的运算符重载?