65,168
社区成员




lea edi,[ebp-0E0h] // ebp-0E0h是可变的
mov ecx,38h // 38h是可变的
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
#include <stdio.h>
struct Node
{
int a;
char b[10];
Node *next;
};
main(void)
{
char *p=NULL; //"define NULL 0" included in <stdio.h>
int *q=0; //值0是唯一能够直接赋给指针变量的整数值
double *d;
Node *pNode=NULL;
d=NULL;
return 0;
}
以上代码在VC环境下调试运行。
step1. 运行完语句Node *pNode=NULL;后:
Name Value
+ &p 0x0012ff7c ""
+ &q 0x0012ff78 ""
+ &d 0x0012ff74 ""
+ &pNode 0x0012ff70 ""
Memory:
0012FF66 CC CC CC CC CC CC CC CC CC CC 00 烫烫烫烫烫.
0012FF71 00 00 00 CC CC CC CC 00 00 00 00 ...烫烫....
0012FF7C 00 00 00 00 C0 FF 12 00 39 11 40 ........9.@
step2. 运行完语句d=NULL;后:
Name Value
+ &p 0x0012ff7c ""
+ &q 0x0012ff78 ""
+ &d 0x0012ff74 ""
+ &pNode 0x0012ff70 ""
Memory:
0012FF66 CC CC CC CC CC CC CC CC CC CC 00 烫烫烫烫烫.
0012FF71 00 00 00 00 00 00 00 00 00 00 00 ...烫烫....
0012FF7C 00 00 00 00 C0 FF 12 00 39 11 40 ........9.@
在Turbo C中的代码如下:
#include <stdio.h>
struct Node
{
int a;
char b[10];
struct Node *next;
};
main(void)
{
char *p=NULL;
int *q=0;
double *d;
struct Node *pNode=NULL;
d=NULL;
return 0;
}
注意:
1. 可以把指针初始化为0、NULL或某个地址,具有值NULL的指针不指向任何值。
2. 当把0赋值给指针时,编译器先把0转换为指向合适数据类型的指针。
3. 值0是唯一能够直接赋给指针变量的整数值
4. 切忌使用未初始化的指针会给系统带来隐藏的危害,一但指针指向非法区域,会造成系统崩溃。
5、就像你所说的 提高了安全性
c就不会自动初始化 所以在未初始化的情况下 操作会得到意想不到的结果
比如指针变量没有初始化 那它里面的值是任意的 也就是它指向的地址是任意的
这样子 有可能访问到系统的内存 这时再进行操作 系统也就挂了
都初始化为0,起码不会出太大问题吧,最多就是结果不对
知识要点:
1、char *pstr;
这么写仅仅是声明了一个指针,由于它没有指向任何地址,所以并不存在指针变量里的值,
此时,pstr=NULL;这种写法仅仅是将指针初始化,将其作为空指针,
一般为了防止进行未初始化的指针被使用出现野指针,所以会这么写。
如果要将一块地址空间(也就是针变量里的值置零)进行初始化,一般这么写:
char pstr[20]={NULL};//初始化时这么写
或者是
memset(pstr,NULL,sizeof(pstr));//代码中这么写
2、指针变量的初始化?
int *p,a;
p=&a;//这样可以,但是要在定义的时候就初始化怎么办?
可以指向空,也可以指向某个变量地址啊
定义时 int *p=NULL;或者int *p=&a; 或者int *p=0;
3、int *q=0; //值0是唯一能够直接赋给指针变量的整数值-------------->分析
初始化指针变量q,有两个作用,首先会在当前系统堆栈区给q开辟一个随机地址&q,同时将*q(指针q所指向的空间的内容)的值修改为0。关于书上说的“野指针的危害性”,通过初始化指针来解决,主要体现在,当我们初始化指针变量q时,会给q一个随机地址&q(该值是随机的堆栈空间地址,不确定),当程序访问到指针变量q时,就不会出现由于没有事先初始化指针变量q,而导致的&q指向危险区域的情况发生。