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语言题的更多相关文章

  1. Java中的成员初始化顺序和内存分配过程

    Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...

  2. C语言中内存分配 (转)

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

  3. 【转】C语言中内存分配

    原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...

  4. C语言中内存分配

     C语言中内存分配   在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...

  5. [c语言]c语言中的内存分配[转]

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

  6. 【LWJGL3】LWJGL3的内存分配设计,第一篇,栈上分配

    简介 LWJGL (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java绑定库.<我的世界> ...

  7. mapreduce 内存分配

    稍微有点mapreduce使用经验的同学肯定对OOM不陌生,对的,我目前在mapReduce里面遇到的最多的报错也是内存分配出错,所以看到好多hadoop执行脚本里面有好多关于内存的参数,虽然是知道和 ...

  8. 第10课 C++中的动态内存分配

    C++中的动态内存分配 C语言是通过库函数来完成动态内存分配的,而C++是通过关键字从语言层面支持的. C语言中的malloc是基于字节来进行内存申请的,C++中是基于类型来进行的. delete加上 ...

  9. 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?(阿里面试)

    JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈.方法区等介绍的比较清楚. 上图,是一张在作者根据<Java虚拟机规范(Java SE 8)>中描述的J ...

随机推荐

  1. java读取配置到Hash表里

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; im ...

  2. layui的表单功能

    作为一个phper还是非常喜欢这个插件的~虽然在vue的群里面说这个插件好被人怼过..废话不多说, 这次使用到的是layui的表单功能.上次的日历忘记做笔记了非常可惜,大部分其实跟着文档撸就可以,这次 ...

  3. equals和== 区别

    转载:https://zhidao.baidu.com/question/61622858.html ==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值. (比较地址值即是指是否 ...

  4. java——Class、动态加载

    Class和Object混淆了? Object: 任何类都是Object类的子类 Class: 任何类都是Class的实例对象 Class可以说是一种特殊的类,它表示的是类类型,Object仍然是Cl ...

  5. 查看pip已经安装过的包

    查看pip已经安装过的包 pip list 查看xx包的安装路径 pip install xx 查看python2的pip安装的包 python2 -m pip list 查看python3 的pip ...

  6. Choose and divide(唯一分解定理)

    首先说一下什么是唯一分解定理 唯一分解定理:任何一个大于1的自然数N,如果N不是质数,那么N可以分解成有限个素数的乘积:例:N=(p1^a1)*(p2^a2)*(p3^a3)......其中p1< ...

  7. LeetCode 981.基于时间的键值存储(C++)

    创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: 1. set(string key, string value, int timestamp) 存储键 key.值 value,以及 ...

  8. socket编程(一)

    因为下载器涉及到socket的知识,就花了一天学习了.因为时间原因分成几部分.(这里记录上的是基于Windows平台的) #include <stdio.h> #include <w ...

  9. DEDE [field:global name=autoindex/] 按序列号递增

    在用织梦仿站的时候,有些class样式是btn1.btn2这样的样式循环的,这个时候1.2可以用[field:global name=autoindex/ ] 循环得到,[field:global n ...

  10. Qt 学习(3)

    Qt 修改 Windows 注册表项 在使用 FT232R 驱动(usb转串口设备)连接电脑时,下位机发送的数据会被转换器缓存起来,由串口转换器驱动设定的延时定时发送到 PC,这样就造成了一个问题:上 ...