永发信息网

Linux C中 void *p; *((int *)p)=4; 与 int a=5;void *p=(void *)&a; 有木有区别?

答案:5  悬赏:30  手机版
解决时间 2021-04-05 18:55
  • 提问者网友:爱了却不能说
  • 2021-04-05 02:10
Linux C中 void *p; *((int *)p)=4; 与 int a=5;void *p=(void *)&a; 有木有区别?
最佳答案
  • 五星知识达人网友:杯酒困英雄
  • 2021-04-05 02:54
void *p;    *((int *)p)=4;与    int a=5;    void *p=(void *)&a; 这两条语句是完全不同的。
    int a=5;
    void *p=(void *)&a; //这是一条合法语句,表示定义一个指针变量,并指向一个整型变量的地址。即:通过指针变量p,可以访问到变量a的数据。
    
    void *p; //定义一个指针变量,未指定数据类型(void表示任意类型),也没指定内存空间,是个野指针
    *((int *)p)=4; //这句语法是合规的,但是向野指针中写入数据,会引起core dump.
正确写法:
    int a=5;
    void *p=(void *)&a;
    *((int *)p)=4; //这样写,相当于实现a=4
全部回答
  • 1楼网友:逐風
  • 2021-04-05 07:31
J2EE选手路过
  • 2楼网友:琴狂剑也妄
  • 2021-04-05 06:33
没区别
  • 3楼网友:几近狂妄
  • 2021-04-05 05:34
没什么区别。主要是操作对像不同而已。
前者主要是对指针P的操作,而后者主要对变量a的操作。
具体的细节看他们的汇编代码就可以看出来的。
个人愚见。旨在抛砖引玉……
  • 4楼网友:duile
  • 2021-04-05 04:31
void *p; //定义p为通用指针型变量,p可以保存char型,int型,结构体等类型数据的地址,需要进行类型的强制转换
*((int *)p)=4; //这里的(int *)p,是将p强制转换为保存int型数据的地址变量,最前面这个*,是对已经转换为保存int型数据的地址变量取其内容,这句的作用是地址p所指向内容为4.
int a=5;
void *p=(void *)&a; //&a表示取a的地址,其前面的(void*)表示将a的地址强制转换为通用的地址类型,然后(void *)&a;这个地址赋值给通用的地址类型变量p.
前者是对*p进行赋值操作;后者是对p进行赋值操作,这个是最大的区别.追问这个我知道,,,我要知道的是这两个指针 到底有啥关系以及区别(可能没区别的)。。。。
我就怀疑有区别 但又不知道哪里。。所以想请教个位大侠。追答定义都是void *p;所以p的本质是一个void型指针,这是不存在区别的;
前者指针变量p所指向的值所直接赋值的,这个其实是非法的,我刚在Ubuntu下试了一下这下面的代码,虽然可以编译通过,但是运行会出现:Segmentation fault:
#include
int main(void)
{
void *p=NULL;
*((int *)p)=4;
printf("%d\n",*((int *)p));
return 0;
}
后者指针变量p所指向的值是间接的,是将值赋给一个变量,然后将变量的地址赋给指针变量p,以后就可以直接对*p操作改变那个变量a的值.这是合法的.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯