| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2994 人关注过本帖
标题:int a; 之后a在内存中到底是什么样的存在
只看楼主 加入收藏
冬天之火
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-3-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
int a; 之后a在内存中到底是什么样的存在
有没有人知道   int a;   之后a在内存中到底是什么样的存在,一般不出现问题我是不会刨根问底的,因为在某个一百行以上的代码中我写了这么一句
scanf("%d",a);而写这句的情况恰恰是在链表的操作中,真是无语,找了好久。因此想知道一点关于变量的原理,或者大家有没有什么办法能够让人永远在这个读入输入的时候就记得写&的好方法呢 ?
搜索更多相关主题的帖子: 恰恰 
2016-04-11 00:11
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:1 
int a; 执行后程序为a分配了相应大小内存,但里面的值是不确定的,因为没有赋值。scanf("%d",&a)这个是很容易记的东西啊。

   唯实惟新 至诚致志
2016-04-11 08:25
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:1 
int a;正如Q版说的,执行后仅分配了int型数据的大小内存(具体大小不同编译器有可能不同),但里面的值是不确定的,所以一般建议定义变量的同时赋初值,哪怕是个0;这样不至于出BUG后不容易找;
至于你说的使用scanf函数的时候记得写&取地址符这个问题,其实你不用死记硬背,要理解scanf的作用,或者形象联想记忆,就像之前我在一个叫啊哈C里面看到的,scanf要把一个数据放到之前定义的变量a所占有的内存中去(把这个内存比喻为小房子),你要放东西到房子里面,是不是要先找到这个房子的门牌号(也就是变量的地址了);所以就要用到&这个取地址符来告诉函数scanf,房子在哪里,才能把东西放进去啊
希望帮到你
2016-04-11 08:42
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:1 
你需要的不是 让自己永远记住 &
你需要的是 dubug的方法
这种情况 你可以在出问题之前 下断点
然后单步跟进 很容易发现是scanf 语句执行的时候 你敲击回车之后就崩溃
定位成功 自己仔细看scanf 很容易发现错误所在

不了解怎么使用断点 可以上网搜索
你使用的编程软件 + 断点调试
比如 vs2008 断点调试

多了解了解 能自己查出错误 进步比较快

https://zh.
2016-04-11 09:49
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:1 
用多了自然会记得

一片落叶掉进了回忆的流年。
2016-04-11 09:57
AXRZ
Rank: 2
等 级:论坛游民
威 望:5
帖 子:48
专家分:84
注 册:2016-3-23
收藏
得分:16 
建议你去了解一下程序在内存中的格式。
在早些基础的操作系统中,程序分为四个段:代码段,数据段,堆栈段,附加段
代码段:你的代码在这里
数据段:你的变量在这里
堆栈段:为函数传递参数的堆栈在这里
附加段:扩展用的

但是随着系统的发展,GDT出现后,程序被操作系统载入到内存时的地址是虚拟的,而各个程序的各个段在内存中也不一定是连续的。
注意:其实变量就是内存中的一个空间,对其进行修改需要寻址

扯远了,int a实际上只是告诉编译器在数据段中腾出4个字节(32位程序是4,64位是8)给你的变量使用,至于为什么要加&,是因为在C语言中,如果你scanf("%d", a);的话a是作为该内存中的副本被传递到参数的,所以这样明显是错误的。scanf("%d", &a);则是将a的地址作为参数传递给scanf,这样scanf才可以往该地址写入数据
2016-04-11 10:58
冬天之火
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-3-1
收藏
得分:0 
我来个总结吧,我们用printf("%d\n",a);的时候得到了一个副本所以对副本的修改是不会影响源头的。好了就这样,非常感谢各位大神的热心解答及围观。
2016-04-11 16:49
AXRZ
Rank: 2
等 级:论坛游民
威 望:5
帖 子:48
专家分:84
注 册:2016-3-23
收藏
得分:0 
回复 6楼 AXRZ
另外补充一下,现在的操作系统的局部变量是在堆栈的中的,在windows下int a代表在堆栈中腾出相应空间
2016-04-12 02:39
快速回复:int a; 之后a在内存中到底是什么样的存在
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020328 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved