关于定义顺序和内存分配的关系--记一道不严谨的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 ...
随机推荐
- Gym - 101572D Distinctive Character bfs 思维
题目传送门 题目大意: 给出n个01串,让你构造一个字符串,使这个字符串和这些字符串中相似程度最高 尽可能低.如果两个字符串对应位置相同,则相似程度加一. 思路: 每一个01串更改自己的一部分后,都可 ...
- matplolib实例之 城市气候与海洋的关系研究
- find命令使用
find命令 find [PATH] [option] [action] 参数: 1.与时间相关参数 -atime -ctime -mtime 以mtime为例: -mtime n:n为数字,意义为在 ...
- python学习:python文件中空格和换行符的捕获和文本文件的转存
0. 背景 之前公司的项目中,需要在嵌入式系统中实现一个http的网页端内容,由于项目历史遗留问题,公司是采用的将html文件转成c语言头文件的方式,每次修改页面端都需要从新编译一下程序,非常的繁琐. ...
- yii2下的路由重写
1.在config/main.php中添加配置信息 文件位置如图所示(图中展示的是backend下的config,也可以在fronted和common的config中添加) 配置的代码标准格式如下 ' ...
- 转 Python-IndexError: list index out of range
https://www.cnblogs.com/2bjiujiu/p/9063864.html Error:IndexError: list index out of range Where? 对Py ...
- xml和json互转
开发过程中有些时候需要把xml和json互转,如某钱X接口入参和出参都是xml格式的,十分蛋疼.特写下面工具类,以留用. 需要引用jar: <!-- https://mvnrepository. ...
- python 16 进程和线程
进程和线程 很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统. 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务. ...
- volatile的作用和原理
1.保持内存可见性内存可见性:所有线程都能看到共享内存的最新状态.每次读取前必须先从主内存刷新最新的值.每次写入后必须立即同步回主内存当中.Java通过几种原子操作完成工作内存和主内存的交互:lock ...
- 人工智能和机器学习 AI&ML howto
我关心的AI.ML的分支领域: 我的博客:Deep Learning 和 Knowledge Graph howto (有关DL&KG的资料都在这里) https://www.cnblogs. ...