指针问题123

指针问题1:未初始化的变量的值 0Xcccccccc -858993460 烫


int:-858993460(十六进制OXCCCCCCCC)(二进制11001100110011001100110011001100)
a、当一个未初始化赋值的时候(至少是vc 下未初始化的内存)默认是0xCCCCCCCC;,他在内存就默认保存为-858993460 即二进制的11001100 11001100 11001100 11001100; 十六进制的CCCCCCCC;而汉字 "烫" 的编码恰好就是1100110011001100:
b、如果变量的数据类型由于你的运算的溢出了,在内存中系统就自动改为-858993460


指针问题2:new 和delete

link *p=new link;
delete p;
p=NULL;
为什么delete之后还能赋值呢?
变量p是在栈上分配的空间,具体的内容在堆上,也就是你new的那部分内容。 
当你delete时,受影响的是堆的内容,而栈上的这个p没有发生丝毫的改变,是什么还是什么。 
既然,你在声明p的时候,可以给他赋值,那么为什么在后面就不能了呢? 当然是可以的,它还是那个p.

这句话是从网上找的,我觉得有点不妥,每个指针未被初始化时值为0xcccccccc这个值是在栈上分配的,而new后它在栈上的值变为了另一个,例如:0x00322d78,同时new在堆上分配了内容,当delete之后发现p的值还是0x00322d78而不是初始的0xcccccccc,说明delete只是释放了堆上的内容而栈上的这个值没改变,所以说这个p的值其实发生了改变,所以我们delete p之后还往往要使p=null,防止发生错误,本人的一点见解,如有错误欢迎指正

指针问题3 指针值得解释

#include<iostream.h>
struct link
{
int data;
link *next;
};
int main()
{

	link* p=NULL;指针p未被初始化的值为0xcccccccc,初始化后变为0x00000000
//	cout<<p->next;对空指针进行操作操作系统会报错,unhandled exception in .exe;0xc0000005 Access violation 地址越界了
	link *q=new link;指针q初始值也为0xcccccccc,new之后变为了另一个值,例如0x00322d78

	delete q;delete之后指针q的这个值并没有发生变化,前面问题2有解释
	cout<<q;这行可以正常运行
cout<<q->next;这行也可以
//cout<<q->next->next;但是这行出现错误了和上面一样的错误 地址越界,这个不是很明白为什么上面一行可以正常运行,请高人解答
return 0;
}
这里收集了一些常见的地址问题:
      0xcdcdcdcd - Created but not initialized  
   0xdddddddd - Deleted  
   0xfeeefeee - Freed memory set by NT's heap manager  
   0xcccccccc - Uninitialized locals in VC6 when you compile w/ /GZ  
   0xabababab - Memory following a block allocated by LocalAlloc()  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值