C语言 指针 【“空指针”传参问题】

您所在的位置:网站首页 结构体指针作为参数会改变实参吗 C语言 指针 【“空指针”传参问题】

C语言 指针 【“空指针”传参问题】

2024-07-11 03:09| 来源: 网络整理| 查看: 265

再谈一谈空指针传参。写平衡二叉树时,因为传递进去了一个结点,而结点指向空,所以无论其他地方怎么改,都频频报错。

一、普通指针

对于普通指针,我们要分清如果一个指针本身是NULL,那意味着它指向空;但是,指针也是数据,他的二级指针可不是NULL,而是这块指针的地址。

void changeP(int** p) { int* p2 = (int*)malloc(sizeof(int*)); printf("p2的值为:%p \n", p2); *p = p2; } int main() { int* ret = NULL; printf("ret的地址为:%p \n", &ret); changeP(&ret); printf("ret的值为:%p \n", ret); free(ret); return 0; }

 

二、结构体指针

这里写一个人类来举例:

 

 

依然是报异常。

错误原因:

这里的p虽然指向NULL,但他的地址是存在的。

而setAge函数里,形参也是指针,

他们俩是同一种类型。

所以本质上,这是一个传值传参。

这段代码的问题:

当函数执行完后,首先,p1是开辟在堆区的,没有释放;

其次,这是一个传值传参,所以回到主函数后,p仍然是一个空指针,

自然就没有age一说了。

所以会报异常。

改法:

还是使用二级指针,来对一级指针进行操作:

typedef struct People { int age; }People,*P; //p就是结构体指针。 void setAge(P* p1) { P p2 = (People*)malloc(sizeof(People)); *p1 = p2; (*p1)->age = 5; } int main() { //Tree t = NULL; //insert(t, 5); //cout data; P p = NULL; P* pp = &p; setAge(pp); cout age; free(p); return 0; }

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3