c语言二级指针初始化为空后赋值问题 5

/*有问题的例子*/voidtest1(int**ppint){int*pint=(int*)malloc(sizeof(int)*100);//为什么在这里会报错*pp... /* 有问题的例子 */
void test1(int **ppint)
{
int *pint=(int *)malloc(sizeof(int)*100);//为什么在这里会报错
*ppint=pint;

}
int main()
{
int **ppdata=NULL;
test1(ppdata);
return 0;

}
/* 没有问题的例子*/
void test(int **ppint)
{
int *pint=(int *)malloc(sizeof(int)*100);//这里却能正常赋值,是不是对二级指针理解有问题?
*ppint=pint;

}
int main()
{
int *ppdata=NULL;
test(&ppdata);
return 0;

}
展开
 我来答
百度网友1804174
2017-09-05
知道答主
回答量:2
采纳率:0%
帮助的人:2179
展开全部
对指针的理解不够深刻,首先指针也是一个变量。二级指针保存着是一级指针地址的变量,所以int **ppdata = NULL说明了 这个二级指针保存的是一个一级指针的地址,保存的地址是0;由于保护模式的缘故,(可自行查阅资料),ring3无法对保护段的内存进行读写,所以会出现运行时崩溃。而第一个没报错的原因是因为一级指针虽然初始化保存了0的地址,但是代码在之后的操对一级指针进行重新赋值让其指向了别的内存段。所以没报错。
匿名用户
2018-07-26
展开全部
给二级指针的一级指针赋地址,之所以会出错,尽管二级指针已经置为NULL,但因为其一级指针指向是不定的,也就是说没有赋值NULL,当你给它赋值就会出现段错误。这和指针初始化要为NULL的原因是一致的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友ceb8908
2020-10-11 · TA获得超过133个赞
知道答主
回答量:72
采纳率:100%
帮助的人:14.5万
展开全部
1报错的应该是标注的*ppint=pint;这行吧。正常的例子是给ppdata赋值了malloc的一个地址;错误的例子是给*pdata即 NULL赋值了malloc的一个地址。NULL是不允许赋值的。
出错的原因是ppint没有赋值有效的内存地址,他应该指向一个一级指针变量的地址,而这里指向的是null。
2先理解一下二级指针的含义(程序中的变量值的都是一个地址,不同的变量类型是地址存的内容类型不同):
int a =256;//a是一个变量,a对应的是一个保存普通变量的地址,这个地址存的值是256
int *pint = &a;//pint是一级指针,pint对应的是一个保存普通变量地址的地址,他保存的值是a的地址
int **ppint = &pint;//ppint是二级指针,ppint对应的是一个保存指针变量的地址,他保存的值是pint的地址。
ppint这个地存的是pint的地址,pint存的是a的地址,a存的是个值256;可以看到
*ppint = pint = &a //a的地址,这里的=标示等于不是c语言中的赋值
重点来了*ppint = &a,不会报错,应为*ppint 合法的地址,他就是pint。但是如果只初始int *ppint = NULL,然后 int *ppint = &a就会报错,因为*ppint =NULL指向的是一个一级指针的地址,这个地址目前是NULL,不是有效的地址,无法给他复制。
3主意正常的例子中int *ppdata=NULL;这句,ppdata名字有点迷惑人,看着是个二级指针,实际是个一级指针。
有问题的例子,做如下修改应该也是可以编过的。
oid test1(int **ppint)
{
int *pint=(int *)malloc(sizeof(int)*100);
*ppint=pint;//这里不会报错,因为他等价pdata=pint;//pdata是有效的地址。
}
int main()
{
int * pdata =NULL;
int **ppdata=&pdata;

test1(ppdata);
return 0;

}
我现在知道上面的每一行是什么意思,但是三天之后再回过头来可能我自己也看不懂了。
万恶的**p
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
阳光的雷咩咩
2017-06-17 · TA获得超过1.4万个赞
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:7807万
展开全部
你标注释的地方错了吧,应该是后面那行出错,不然写法一样怎么可能一个出错一个不出错
追问
是我标记的地方出错,具体原因?
追答
看不出来 觉得没必要那样写代码
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式