*p = NULL 与p = NULL的区别是什么

C语言 码拜 9年前 (2016-02-01) 1722次浏览
下面是测试两者的程序:

#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
请帮本人释疑。

解决方案:5分
第1个是:把p指向的int赋值为0(NULL即为0), 再把p指向的int赋值为5,所以为5
第2个是: 把p的值改为0,即指向0x00000000位置的内存,然后将这块内存值改成5。windows中,0位置的虚拟内存空间应该是指向内核函数,不能访问才对,不知道为什么你没出错。
第3个和第2个应该是一样的,undeclared identifier这个错误莫名其妙,而且””P””也是大写P,问一下你用的什么编译器,你确定代码和你贴上来的代码一致?
解决方案:5分
1: NULL 就是 0
2:p = NULL,p就指向空了,再对*p 赋值肯定是非法操作,程序会崩掉的。另外,对p申请空间了,直接p = NULL,那动态申请的空间就没释放,造成内存泄露。
3:直接就p = NULL,和问题2一样,p还是一样不知道指向哪,又对它赋值,程序崩了。
解决方案:5分
*p = NULL ; //p指向的内存空间上的内容为空
 p = NULL ; //p指向的内存空间为空,也就是p没有执行任何地方!空指针
解决方案:7分
P是地址本身
*P是该地址指向的数据
例如地址从1开始
我们有如下代码

int *p;//声明一个int型指针,此时p和*p的值为未定义,根据编译器的实现而定,
p = 1;//把p指向内存地址为1的地方
*p = 5;//在内存地址为1的内存空间存入一个整数,此整数为5

由此可见:
第一个程序,你在申请的内存地址先存入了NULL,又存入了5,其实意思就是对一个变相先赋一个值,再赋另外一个值,所以后一个覆盖前一个理所当然
第二个程序中,开始p指向刚申请的内存地址,然后你把P指向了一个为NULL的地址,至于此地址存放的是什么就不知道了,然后你在此地址赋值5,假如之前的那个地址有系统存放的数据,你的5就会覆盖此处的数据,这是很危险的,编译器做了保护所以才没崩溃,返回一个空
至于程序3,p没有申请空间就赋值肯定是会崩溃的,但是你先赋值了NULL,再赋值5,问题应该是跟2一样的,至于报的错误应该是你代码误写造成了,好好检查一下再看看

解决方案:3分
int *p;
p是一个int型的指针,p=NULL;表示让该指针指向一个0地址(无效地址)
*p表示对指针的“解引用”操作,表示p指向的地址的对象,这个不能赋值为NULL吧
解决方案:3分
概念性问题。一个是“给指针赋值”,一个是“给指针指向的地址赋值”。
解决方案:2分
原来在学术版也能看到星哥 真是好精力啊
解决方案:5分
第二个程序, 建立了空栈是什么意思? 程序很简单, 就是在堆上开辟了一块空间(int那么大, 也就是4个字节), 指针p指向这块空间. 然后p = NULL;就是 指针p指向0x0000 0000地址了, 不再指向刚在堆上开辟的那块空间了. 然后你给0x0000 0000这个地址赋值, 肯定无效了, 自然也无输出.
第三个程序, 声明的指针变量是p, P根本没声明, 当然出错误了, 编译时就会错, 而不是运行时.
解决方案:3分
int  *p ; //定义了一个指针,指向不明确,也指针
p= NULL; //指针置空,不指向任何地方,所以也没有执行内存空间,
// 建议:看看内存管理这方面的知识,这些就比较清楚了
解决方案:2分
指针指向都被你破坏了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明*p = NULL 与p = NULL的区别是什么
喜欢 (0)
[1034331897@qq.com]
分享 (0)