*p NULL 与p NULL的区别是什么下面是测试两者的程序:#include stdafx.h#include stdio.h#include
*p = NULL 与p = NULL的区别是什么
下面是测试两者的程序:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
int *p;
p = (int *)malloc(sizeof(int));
*p = NULL;
*p = 5;
printf("%d\n", *p);
return 0;
}
得到的结果是
5
Press any key to continue
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
int *p;
p = (int *)malloc(sizeof(int));
p = NULL;//此处与第一个程序不同,把*p改成p
*p = 5;
printf("%d\n", *p);
return 0;
}
得到的结果是
Press any key to continue
没有任何输出。
请问第二个程序能否说是建立了一个空栈?
第三个程序
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
int *p;
p = NULL;//这一处算是分配空间吗?
*P = 5;
printf("%d\n", *p);
return 0;
}
运行时有错误:
'P' : undeclared identifier
请帮我释疑。
[解决办法]第1个是:把p指向的int赋值为0(NULL即为0), 再把p指向的int赋值为5,所以为5
第2个是: 把p的值改为0,即指向0x00000000位置的内存,然后将这块内存值改成5。windows中,0位置的虚拟内存空间应该是指向内核函数,不能访问才对,不知道为什么你没出错。
第3个和第2个应该是一样的,undeclared identifier这个错误莫名其妙,而且'P'也是大写P,请问你用的什么编译器,你确定代码和你贴上来的代码一致?
[解决办法]1: NULL 就是 0
2:p = NULL,p就指向空了,再对*p 赋值肯定是非法操作,程序会崩掉的。另外,对p申请空间了,直接p = NULL,那动态申请的空间就没释放,造成内存泄露。
3:直接就p = NULL,和问题2一样,p还是一样不知道指向哪,又对它赋值,程序崩了。
[解决办法]
*p = NULL ; //p指向的内存空间上的内容为空
p = NULL ; //p指向的内存空间为空,也就是p没有执行任何地方!空指针
------解决方案--------------------
P是地址本身
*P是该地址指向的数据
例如地址从1开始
我们有如下代码
[解决办法]第二个程序, 建立了空栈是什么意思? 程序很简单, 就是在堆上开辟了一块空间(int那么大, 也就是4个字节), 指针p指向这块空间. 然后p = NULL;就是 指针p指向0x0000 0000地址了, 不再指向刚在堆上开辟的那块空间了. 然后你给0x0000 0000这个地址赋值, 肯定无效了, 自然也无输出.
第三个程序, 声明的指针变量是p, P根本没声明, 当然出错误了, 编译时就会错, 而不是运行时.
[解决办法]
int *p ; //定义了一个指针,指向不明确,也指针
p= NULL; //指针置空,不指向任何地方,所以也没有执行内存空间,
// 建议:看看内存管理这方面的知识,这些就比较清楚了
[解决办法]指针指向都被你破坏了。