关于定义顺序和内存分配的关系--记一道不严谨的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语言题的更多相关文章
- Java中的成员初始化顺序和内存分配过程
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...
- C语言中内存分配 (转)
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- 【转】C语言中内存分配
原文:C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...
- C语言中内存分配
C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要 ...
- [c语言]c语言中的内存分配[转]
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- 【LWJGL3】LWJGL3的内存分配设计,第一篇,栈上分配
简介 LWJGL (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java绑定库.<我的世界> ...
- mapreduce 内存分配
稍微有点mapreduce使用经验的同学肯定对OOM不陌生,对的,我目前在mapReduce里面遇到的最多的报错也是内存分配出错,所以看到好多hadoop执行脚本里面有好多关于内存的参数,虽然是知道和 ...
- 第10课 C++中的动态内存分配
C++中的动态内存分配 C语言是通过库函数来完成动态内存分配的,而C++是通过关键字从语言层面支持的. C语言中的malloc是基于字节来进行内存申请的,C++中是基于类型来进行的. delete加上 ...
- 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?(阿里面试)
JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈.方法区等介绍的比较清楚. 上图,是一张在作者根据<Java虚拟机规范(Java SE 8)>中描述的J ...
随机推荐
- Luogu P4404 [JSOI2010]缓存交换 优先队列
细节题?...调了半天.... 可以发现,每一次从缓存中删除的主存一定是下次访问最晚的,可以用优先队列来处理...还有要离散化...还有链表末尾要多建一些点...否则会死的很惨... #include ...
- Applese 的毒气炸弹(最小生成树)
链接:https://ac.nowcoder.com/acm/contest/330/G 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 找出区间[A, B]内所有数字的奇数字位出现次数为偶数,偶数字位出现次数为计数的数的个数。(数位DP)
题目:找出区间[A, B]内所有数字的奇数字位出现次数为偶数,偶数字位出现次数为计数的数的个数. 分析:这道题的状态同样不好取,因为要求每一个奇数的个数都要为偶数,每一个偶数的位数都要为奇数,又因为只 ...
- echarts分段(一段一种颜色)显示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- day34 协程
1. 前提 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把cpu的利用率提高很多了.但是我们知道无论是创建多进程还 ...
- hive 取两次记录的时间差 lead lag first_value last_value
-- LEAD(col,n,DEFAULT) 用于统计窗口内往下第n行值 -- 第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如 ...
- 技巧:Ubuntu踩坑记之网络配置哪里找
今天在虚拟机中遇到一个关于网络配置的坑,在此记录下来. 我们都知道虚拟机系统(此处指的是vmware)中,虚拟网络主要由三个方式实现: 桥接网络 NAT转换 主机共享网络 在这三种方式下,一般我们使用 ...
- SQL Server Reporting Service(SSRS) 第四篇 SSRS 常见问题总结
1. 如何让表头在每页显示(译) A. 打开高级模式: 在分组栏中点击Column Goups右侧的箭头选择高级模式; B. 找到第一个Static组 在Row Groups区域中(注意不是Colu ...
- Excel中,用CONCATENATE函数生成SQL语句
1.语法 CONCATENATE(text1, [text2], ...)CONCATENATE 函数语法具有下列参数(参数为:操作.事件.方法.属性.函数或过程提供信息的值.):Text1 必需.要 ...
- JAVA HTTP请求和HTTPS请求
HTTP与HTTPS区别:http://blog.csdn.net/lyhjava/article/details/51860215 URL发送 HTTP.HTTPS:http://blog.csdn ...