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;
} 展开
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;
} 展开
4个回答
2018-07-26
展开全部
给二级指针的一级指针赋地址,之所以会出错,尽管二级指针已经置为NULL,但因为其一级指针指向是不定的,也就是说没有赋值NULL,当你给它赋值就会出现段错误。这和指针初始化要为NULL的原因是一致的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
出错的原因是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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你标注释的地方错了吧,应该是后面那行出错,不然写法一样怎么可能一个出错一个不出错
追问
是我标记的地方出错,具体原因?
追答
看不出来 觉得没必要那样写代码
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询