首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

*p = NULL 与p = NULL的差异是什么

2013-09-07 
*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开始
我们有如下代码


[解决办法]
引用:
下面是测试两者的程序:

#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根本没声明, 当然出错误了, 编译时就会错, 而不是运行时.
[解决办法]

引用:
我之所以会说是空栈,是因为我的知识不够,说错了,原以为自己了解到了网上的一个视频,以为对方说这样是一个空栈,后来再回头看那个视频,确实是自己没有理解清楚。
我经常搞不清楚编译与运行,这次谢谢11楼上指出。



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

// 建议:看看内存管理这方面的知识,这些就比较清楚了

[解决办法]
指针指向都被你破坏了。

热点排行