c语言,二重指针的赋值问题

为什么没有这一句程序就会崩溃呢,
#include<stdio.h>
int main()
{
int **p;
int *pt;
int a=100;
p=&pt;//为什么没有这一句程序就会崩溃呢
*p=&a;
printf("%d\n",*p);
return 0;
}

给你仔细分析下哈:

首先,指针p是个二重指针,说白了就是它的值是另外一个int型指针变量的地址

截止到你问的那行,现在我们已知a的值是100,假设a的地址是0x1290F54C,pt的地址是0x7FCA6513,pt的值未知(野指针,值是什么都有可能),p也是野指针

如果没有你注释的那一句,*p意味着要取p指向变量的内容,刚刚说了,p是野指针,那么给野指针取内容当然要崩溃

怎么让p不是野指针呢?先给p赋值就行了,但是要记住,p是二重指针,指向的类型必须是某个int指针的地址,所以初始p就这么写:p=&pt;

你就记住,指针本质上就是整型变量,只不过它里面的整数代表地址,可以取对应地址的内容。

而且,如果你想输出a的值printf("%d\n",*p);是不行的,这个输出的是a的地址的10进制形式。
输出a的值应该是printf("%d\n",**p);
输出地址最好用16进制printf("%x\n",*p);
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-01-01
首先,指针p是个二重指针,说白了就是它的值是另外一个int型指针变量的地址

截止到你问的那行,现在我们已知a的值是100,假设a的地址是0x1290F54C,pt的地址是0x7FCA6513,pt的值未知(野指针,值是什么都有可能),p也是野指针

如果没有你注释的那一句,*p意味着要取p指向变量的内容,刚刚说了,p是野指针,那么给野指针取内容当然要崩溃

怎么让p不是野指针呢?先给p赋值就行了,但是要记住,p是二重指针,指向的类型必须是某个int指针的地址,所以初始p就这么写:p=&pt;

你就记住,指针本质上就是整型变量,只不过它里面的整数代表地址,可以取对应地址的内容。

而且,如果你想输出a的值printf("%d\n",*p);是不行的,这个输出的是a的地址的10进制形式。
输出a的值应该是printf("%d\n",**p);
输出地址最好用16进制printf("%x\n",*p);
第2个回答  2014-08-23
错误处:*p = &a;

你的int **p; 正如楼上所讲的那样,p没有指向一个空间。

1)比如:
int *pt;
*pt = 10;
这个你可能一看就知道错了。因为pt没有开辟空间。*pt为在这个空间里面存东西。
2)再如:
int a = 10;
int **p;
*p = &a;
这个不是一样的原理吗?*p在这个空间里面存东西合理吗?
第3个回答  2014-08-23

没有语句p=&pt;

导致指针p始终是一个野指针,其指向的是一个随机的空间地址,对这个地址的内容进行修改,当然会导致问题

追问

为什么会是野指针?

有*p=&a了为何还是野指针

追答

你这是在修改指针p指向的地址的内容,这个地址是不确定的,怎么可能对!!!

第4个回答  2014-08-23
亲测没这句也是可以的,不过是你输出的时候少了个*号,导致输出的是地址值而不是100这个数。#include<stdio.h>
int main()
{
int **p;
int a=100;
*p=&a;
printf("%d\n",**p);
return 0;
}
相似回答