69,369
社区成员
发帖
与我相关
我的任务
分享
#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;
}
#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;
}
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
int *p;
p = NULL;//这一处算是分配空间吗?
*P = 5;
printf("%d\n", *p);
return 0;
}
int *p ; //定义了一个指针,指向不明确,也指针
p= NULL; //指针置空,不指向任何地方,所以也没有执行内存空间,
// 建议:看看内存管理这方面的知识,这些就比较清楚了
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一样的,至于报的错误应该是你代码误写造成了,好好检查一下再看看
*p = NULL ; //p指向的内存空间上的内容为空
p = NULL ; //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;
}