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

u010179812 2013-09-05 03:15:54
下面是测试两者的程序:

#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

请帮我释疑。



...全文
1831 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝刀君 2016-03-01
  • 打赏
  • 举报
回复 1
第二个程序中,p指向null,把null的地址赋给指针p,但由于null的内容是受操作系统保护的,里面的值不能修改,所以你接下来执行*p=5会出错。
u010179812 2013-09-06
  • 打赏
  • 举报
回复
谢谢大家,越学越觉得自己不懂的太多了。
5t4rk 2013-09-05
  • 打赏
  • 举报
回复
指针指向都被你破坏了。
max_min_ 2013-09-05
  • 打赏
  • 举报
回复
引用 12 楼 u010179812 的回复:
我之所以会说是空栈,是因为我的知识不够,说错了,原以为自己了解到了网上的一个视频,以为对方说这样是一个空栈,后来再回头看那个视频,确实是自己没有理解清楚。 我经常搞不清楚编译与运行,这次谢谢11楼上指出。

int  *p ; //定义了一个指针,指向不明确,也指针
p= NULL; //指针置空,不指向任何地方,所以也没有执行内存空间,

// 建议:看看内存管理这方面的知识,这些就比较清楚了
u010179812 2013-09-05
  • 打赏
  • 举报
回复
我之所以会说是空栈,是因为我的知识不够,说错了,原以为自己了解到了网上的一个视频,以为对方说这样是一个空栈,后来再回头看那个视频,确实是自己没有理解清楚。 我经常搞不清楚编译与运行,这次谢谢11楼上指出。
BT_Dana 2013-09-05
  • 打赏
  • 举报
回复
引用 楼主 u010179812 的回复:
下面是测试两者的程序:
#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 请帮我释疑。
第二个程序, 建立了空栈是什么意思? 程序很简单, 就是在堆上开辟了一块空间(int那么大, 也就是4个字节), 指针p指向这块空间. 然后p = NULL;就是 指针p指向0x0000 0000地址了, 不再指向刚在堆上开辟的那块空间了. 然后你给0x0000 0000这个地址赋值, 肯定无效了, 自然也无输出. 第三个程序, 声明的指针变量是p, P根本没声明, 当然出错误了, 编译时就会错, 而不是运行时.
BT_Dana 2013-09-05
  • 打赏
  • 举报
回复
引用 6 楼 starytx 的回复:
int *p; p是一个int型的指针,p=NULL;表示让该指针指向一个0地址(无效地址) *p表示对指针的“解引用”操作,表示p指向的地址的对象,这个不能赋值为NULL吧
原来在学术版也能看到星哥 真是好精力啊
u010179812 2013-09-05
  • 打赏
  • 举报
回复
另外,1楼在第二个程序提到的release版,我还真没用过,我现在用的是vc++6.0。
u010179812 2013-09-05
  • 打赏
  • 举报
回复
谢谢大家,第三个程序的确是有一个p大小写有误,改正后也第二个程序的结果一样。我好好看看大家的复。另外,大家对6楼版主的问题有什么看法?
rabbitjerry 2013-09-05
  • 打赏
  • 举报
回复
概念性问题。一个是“给指针赋值”,一个是“给指针指向的地址赋值”。
starytx 2013-09-05
  • 打赏
  • 举报
回复
int *p; p是一个int型的指针,p=NULL;表示让该指针指向一个0地址(无效地址) *p表示对指针的“解引用”操作,表示p指向的地址的对象,这个不能赋值为NULL吧
发型不乱hy 2013-09-05
  • 打赏
  • 举报
回复
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一样的,至于报的错误应该是你代码误写造成了,好好检查一下再看看
max_min_ 2013-09-05
  • 打赏
  • 举报
回复

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

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
  int *p;
  p = (int *)malloc(sizeof(int));  //分配一个int大小的内存
  *p = NULL;                       //将分配的内存值,设为NULL
  *p = 5;                          //将分配的内存值,设为5
  printf("%d\n", *p);              //输出分配的内存值,设为5
  return 0;
}
第二个程序

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
    int *p;
    p = (int *)malloc(sizeof(int));    //分配一个int大小的内存
    p = NULL;                          //指针指向NULL的地址
    *p = 5;                            //理论上这里会出错,用release版试试,应当会错。。。
    printf("%d\n", *p);
    return 0;
}
第三个程序:

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
    int *p; 
    p = NULL;              //这一处算是分配空间吗?,不算,只是指向空地址,就好比p是超链接,超链接的链接向一个空地址。
    *P = 5;
    printf("%d\n", *p);
    return 0;
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧