C++中内存分配问题
C++中定义一个变量例如inta,如果没有初始化编译器会自动初始化a为0,说明此时编译器在a声明时就分配了内存。但是当定义一个指针,int*p;时,为什么没有分配内存呢?...
C++中定义一个变量例如int a,如果没有初始化编译器会自动初始化a为0 ,说明此时编译器在a声明时就分配了内存。但是当定义一个指针,int *p;时,为什么没有分配内存呢 ? 调试了一下,没有初始化新建的指针p时,p所指向的地址是0xcccccccc, p都有指向了,那为什么还没有分配内存呢 ?
我觉得,声明一个指针int *p;后,就已经分配了内存,int *p;后 &p是有实际的地址的,只是没有该内存中赋值时,编译器会自动给该指针赋值为0xcccccccc 。 不知道正不正确,请指教。 展开
我觉得,声明一个指针int *p;后,就已经分配了内存,int *p;后 &p是有实际的地址的,只是没有该内存中赋值时,编译器会自动给该指针赋值为0xcccccccc 。 不知道正不正确,请指教。 展开
5个回答
展开全部
以32位平台为例,
char c; // 声明一个字符变量c,并为其分配一个8bit的空间,假设为0x22334455
c=41; // 将字符'A'放到刚才分配的0x22334455空间中
char *p = NULL; // 声明一个字符指针p,并为其分配一个32bit的空间,假设为0x44556677,p的值初始化为0
p=&c; // 将0x22334455赋值给p,存入0x44556677中。
p=new char; // 申请一块新的内存,大小为8bit,假设其开始地址为0x88990011,则此时0x44556677中存放的值为0x88990011
delete p; // 释放刚才申请的空间。p的值将被修改,此时0x44556677中存放的地址是未知且危险的。
p = NULL; // 将0x44556677中的值置0。
=====
因此你所认为的:
1. 声明一个指针int *p;后,就已经分配了内存
正确
2. int *p;后 &p是有实际的地址的
意思正确,表达有问题。应该说p是有实际地址的,&p就是这个地址,在上面的例子中为0x44556677。
3. 只是没有该内存中赋值时,编译器会自动给该指针赋值为0xcccccccc
基本正确。这是VC干的事情,在VC中基本上未初始化的指针都是这个值,但是平台不一样这个值可能会不同。因此为了自己判断的方便,闲置或初始化的指针一般都设为NULL。
char c; // 声明一个字符变量c,并为其分配一个8bit的空间,假设为0x22334455
c=41; // 将字符'A'放到刚才分配的0x22334455空间中
char *p = NULL; // 声明一个字符指针p,并为其分配一个32bit的空间,假设为0x44556677,p的值初始化为0
p=&c; // 将0x22334455赋值给p,存入0x44556677中。
p=new char; // 申请一块新的内存,大小为8bit,假设其开始地址为0x88990011,则此时0x44556677中存放的值为0x88990011
delete p; // 释放刚才申请的空间。p的值将被修改,此时0x44556677中存放的地址是未知且危险的。
p = NULL; // 将0x44556677中的值置0。
=====
因此你所认为的:
1. 声明一个指针int *p;后,就已经分配了内存
正确
2. int *p;后 &p是有实际的地址的
意思正确,表达有问题。应该说p是有实际地址的,&p就是这个地址,在上面的例子中为0x44556677。
3. 只是没有该内存中赋值时,编译器会自动给该指针赋值为0xcccccccc
基本正确。这是VC干的事情,在VC中基本上未初始化的指针都是这个值,但是平台不一样这个值可能会不同。因此为了自己判断的方便,闲置或初始化的指针一般都设为NULL。
追问
恩,很专业,谢谢了。C++中的动态联编请教:
http://zhidao.baidu.com/question/323600046.html
此外 还有一个小问题,如下:
定义一个指针:
int *p;
p = 3; // 报错,类型不匹配
但是如果这样:
int *p = new int;
delete p;
p = 3; // 正确,可以成功赋值,p成功指向0x00000003的内存
请问为什么释放指针指向的内存后,可以直接对该指针赋值,而在之前却不行呢,谢谢!
追答
int *p;
p = 3; // 3的类型是int(编译器隐式转换),而p的类型为int *(用户声明)。
大多数新版的编译器中,无论p是否经过new再delete,直接将3赋值给p都会造成类型不匹配的错误,比如VS2010。
需要注意的是,
p=(int*)0x00000003;
虽然不安全,但却是合法的,无论有没有经过new再delete。
你所指的成功赋值可能存在于部分旧版编译器,但是我无法验证,而且这并不符合C++规范。
请使用最新的编译器。
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
展开全部
int *p 是有分配内存的 这个内存里面放着指向一个int类型的指针 他的大小在现在的一般机器上是4个字节 但是这个指针指向的地方还没有分配内存, 而&p取的是这个指针的地址是存在的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样就OK了,用的是C的话,C语言中声明变量要放在最前边。。。C 中没有这个限制。 你写的代码没问题 估计是编译器的链接出了些问题,我在我的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在函数体外定义的基础类型变量会初始化,
函数体内定义的基础类型变量不会有自动初始化
函数体内定义的基础类型变量不会有自动初始化
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不知道你得理解是不是和我一样.
首先,&p得到的是变量p的地址,这个与p所指向的地址是肯定不同的,&p有值不能代表什么.
然后,分析下int a=10这种写法.在内存中某个假设编号是0x8adf23fe的位置,有块内存,里面写入了值10; 再看int* p=&a这种写法,在内存中某个假设编号是0x23bb8786的位置,有块内存,里面写入了值0x8adf23fe;
所以呢,p不管怎么说,也是个变量,这个变量的值,是另外一个变量的地址而已;如果p没有初始化,编译器就默认把p的值设置成0xcccccccc这个地址,在这个地址中,内存的值被认定为不可读.
当malloc分配内存后,编译器将0x23adad99~0x23adaaaa这段内存设置为可以供你使用的,然后将内存的头的地址返回,你用p接受到这个地址
首先,&p得到的是变量p的地址,这个与p所指向的地址是肯定不同的,&p有值不能代表什么.
然后,分析下int a=10这种写法.在内存中某个假设编号是0x8adf23fe的位置,有块内存,里面写入了值10; 再看int* p=&a这种写法,在内存中某个假设编号是0x23bb8786的位置,有块内存,里面写入了值0x8adf23fe;
所以呢,p不管怎么说,也是个变量,这个变量的值,是另外一个变量的地址而已;如果p没有初始化,编译器就默认把p的值设置成0xcccccccc这个地址,在这个地址中,内存的值被认定为不可读.
当malloc分配内存后,编译器将0x23adad99~0x23adaaaa这段内存设置为可以供你使用的,然后将内存的头的地址返回,你用p接受到这个地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询