新微赢技术网

标题: 请教一个内存分配问题 [打印本页]

作者: √死胖子    时间: 2009-11-3 04:15
标题: 请教一个内存分配问题
请看下边代码:
#include"iostream.h"
#include"iomanip.h"
void main()
{
int i=10;
int *j=&i;
if(!0)
{
int l=20;
int *k=&l;
cout<<&k<<setw(15)<<&l<<endl;
}
cout<<&i<<setw(15)<<&j<<setw(15)<<sizeof(j)<<endl;
}
输出结果为:0x0012FF70 //&k 0x0012FF74 //&l:
0x0012FF7C //&i 0x0012FF78 //&j
请问各位
1:内存的地址如何命名的?地址中的数字和字符各有什么含义?i的地址与其他三个有什么不同?
2:内存中的地址不是连续分布的么?i的赋值应在j前边且连续,l也应在k前边,可结果让我迷惑。。。不知是否与内存赋值方式有关?
3:指针变量在内存中占多少字节(我之前看到很多默认的4字节)?跟它存放的地址类型和大小有关么?


请高手赐教!!
作者: 酷aiq兒kuku    时间: 2009-11-3 04:15
2006-8-22 15:29:37 adaliuliu

等 级:新手上路
帖 子:38
专家分:0
注 册:2006-8-21
第 3 楼   得分:0  

不要意思,献丑,我的意思是变量在内存中的地址值的命名规则是什么?
作者: 逍遥    时间: 2009-11-3 04:15
2006-8-22 15:43:52 song4

等 级:贵宾
威 望:38
帖 子:1531
专家分:0
注 册:2006-3-25
第 5 楼   得分:0  
分向上向下两种
作者: 怎么可能    时间: 2009-11-3 04:15
呵呵,0x0012FF70 是怎么来的?这下明白吧,,

版主说分向上向下两种,能具体解释一下么,从程序结果看我这里是不是向下的?
作者: べ.べ凡士林    时间: 2009-11-3 04:15
以下是引用adaliuliu在2006-8-22 15:24:27的发言:

请看下边代码:
#include"iostream.h"
#include"iomanip.h"
void main()
{
int i=10;
int *j=&i;
if(!0)
{
int l=20;
int *k=&l;
cout<<&k<<setw(15)<<&l<<endl;
}
cout<<&i<<setw(15)<<&j<<setw(15)<<sizeof(j)<<endl;
}
输出结果为:0x0012FF70 //&k 0x0012FF74 //&l:
0x0012FF7C //&i 0x0012FF78 //&j
请问各位
1:内存的地址如何命名的?地址中的数字和字符各有什么含义?i的地址与其他三个有什么不同?
2:内存中的地址不是连续分布的么?i的赋值应在j前边且连续,l也应在k前边,可结果让我迷惑。。。不知是否与内存赋值方式有关?
3:指针变量在内存中占多少字节(我之前看到很多默认的4字节)?跟它存放的地址类型和大小有关么?


请高手赐教!!
细讲一下
1.分向上和向下两种
在栈里的变量空间都是向上扩张,也就是说,根据你定义变量的顺序,依次向上分配空间
而堆的是向下分配空间
那些字符是16进制的表示 I的地址与其他的一样,都在栈内

2.一般情况是连续分配的,因为系统也没有多余的指针来完成地址标记.
特殊情况是,当你定义的变量不是一个"整数",或者过大与这一字符条的时候,毕竟用户不能保证定义4个字节或其倍数的东西
例如
struct tmp
{
int xx;
char x;
};
sizeof(tmp)!=5 it==8
所以与复职无关,原因在1


3.简单说4不是很负责
只能说是sizeof(int)
指针只是储存一下地址,跟储存什么类型无关,指针的类型,只是告诉你他所指的内容和每次移动的字节,方便运算.
作者: 梧桐雨love    时间: 2009-11-3 04:15
我明白了,多谢版主的精彩解答!




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2