指针变量赋值

#include <stdio.h>
int main()
{
int *p = 0;
*p = 1;
return 0;
}
这个函数哪里错了。
网上有说*p=1这句代码的作用是把数值1存入0这个地址,这个操作当然是非法的。
怎么个当然法呢?
首先定义了一个指针变量初始化并赋了地址空间,然后再将1的数值赋值给p指针指向的空间,应该没有什么问题啊。
编译通过,执行时报段错误,求解中!

第1个回答  2012-09-26
你这里定义int *p = 0;实际上就是把p赋值为空指针,空指针就是没有指向任何内存单元的指针,你往一个空地址赋值,当然会出错误了!
第2个回答  2012-09-26
int *p = 0; //这是定义p为指针变量,*为指针标识符,初始值0为地址,表示p指向空,
*p = 1;//这是给p所指单元赋值为1,但本程序中p为空指针,所以出现了错,
以下代码正确:
int main()
{
int a,*p = &a; //p有具体的地址指向,即指向a
*p = 1; //*p访问的就是a,即本语句是将a值赋为1
return 0;
}
第3个回答  2012-09-26
初始化*p时,不能用数字,只能用变量。如,int a=1;int *p=&a;return *p;追问

0x00000000这样的地址数字也不行吗

追答

不可以,这是windows系统规定的,用户不能直接访问内存单元,比如,0x0000000里是某个应用程序,你访问了不就造成信息外露或者恶意篡改了吗?

追问

哦,忘了说了。我是linux环境,但你讲的道理是一样的,谢谢你,也谢谢大家!

第4个回答  2012-09-26
int *p = 0 ;
这个p相当于 门牌号
你现在没有门牌号 却要往人家里送信 怎么可能送到追问

0是不能被选来做地址吗?很多头文件里用到的的NULL就是0啊!

追答

关键是0这个地址是没有实际意义的,你给人写信说送到 “xxx” (实际不存在) 可能吗?

你往里写东西其实是往内存里存数据, int* p = new int; 就相当于在内存里给你找了一个地址安家

p返回的就是这个地址的门牌号,然后你就可以送信,取信了

追问

类似0x00000000这样的地址数字也不行吗

追答

  你可以试试别的随机数字地址,有的可以有的不可以,这就涉及到进程在内存中的分布问题。

  0x00000000 确实是一个内存地址,但是并不属于你的程序所管辖,可能是系统在用,也可能你程序中的其他部分在使用,你用别人家的东西肯定不可以了。 new 就相当于你自己买了块地,怎么搞都可以了

本回答被提问者采纳
第5个回答  2012-09-26
定义指针的时候要先让指针指向一个地址,然后才能给指针赋值。
0就相当于空,就是说你没有给P一个地址,那怎么能赋值呢。
相似回答