| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 520 人关注过本帖
标题:关于存储空间的问题
只看楼主 加入收藏
tanqf
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2012-6-12
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
关于存储空间的问题
我在学C语言时,对教程里的一些概念不太理解,如:
1)教程里说“编译程序会为变量分配一定的存储单元”,我对这一句不理解,不是说程序只有加载到内存时才分配存储单元吗?编译只是生成一个可执行文
   件,怎能给变量分配存储单元呢?
2)教程里常假设一个变量所占存储单元的起始地址为2000,这里“2000”客观存在吗?是不是物理内存存储单元的标识?
3)继上一个问题,我试图输出一个变量的地址值,因此编了下面一段程序:
   #include"stdio.h"
   main()
   {
    int a[2];
    int *p;
    p=a;
    printf("p=%d\n",p);
    printf("p+1=%d\n",p+1);
   }
   以上程序运行结果如下:
        p=1245048
        p+1=1245052
   这些数值是内存单元的地址值吗?
   敬请乐为人师的网友对上述问题一一作答,不胜感谢!
搜索更多相关主题的帖子: 存储 include C语言 
2012-06-12 12:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
乐为人师可不是个褒义词。

重剑无锋,大巧不工
2012-06-12 12:16
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:4 
p=1245048
p+1=1245052
就是内存单元的地址了。
假设的2000当然存在,只要允许访问,你也可以访问它。
一个int在你的机器中占4个字节。
你可以这样试试看,
int (*p)[2] = &a;
在看看 p+1等于多少。
收到的鲜花
  • tanqf2012-06-12 16:33 送鲜花  2朵  
2012-06-12 12:38
做梦追梦
Rank: 2
等 级:论坛游民
帖 子:22
专家分:28
注 册:2012-2-7
收藏
得分:2 
p=1245048
 p+1=1245052
定义数组时分配存储空间,p指向a数组的首地址,int整型变量占4个字节。
 
2012-06-12 18:14
摘星星的猴
Rank: 2
来 自:浙江
等 级:论坛游民
帖 子:14
专家分:23
注 册:2010-9-30
收藏
得分:8 
编译器在编译程序的时候,的确已经为全局变量分配好了存储单元,这里所谓的存储单元是相对于你这个程序而言的。(在计算机中,程序地址的访问使用段地址+偏移量来实现,这里的偏移量是相对于这个段地址来说的),即编译程序在编译的时候,相对于这个程序的首地址开始,为这个变量分配好了在程序内的偏移量处的内存单元。
而程序在加载的时候,可以说操作系统只是为这个可执行文件分配了段地址,而程序本身的内在结构是不会变化的,即程序依旧可以使用偏移量的方法来访问这个变量。



表达的不是很清楚。。。。。有疑问可以再商讨
2012-06-13 11:54
摘星星的猴
Rank: 2
来 自:浙江
等 级:论坛游民
帖 子:14
专家分:23
注 册:2010-9-30
收藏
得分:6 
建议你使用TC编译器来学习有关于C语言的内存分配机制,TC编译器是16位的编译器,在使用TC编译的程序的时候,程序默认输出的地址仅仅是该变量相对于程序数据区的偏移量地址。这样可以防止VC编译器中“段地址”的输出对你学习内存分配机制的影响。
2012-06-13 11:59
快速回复:关于存储空间的问题
数据加载中...
 
   



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

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