C语言 指针 【“空指针”传参问题】 |
您所在的位置:网站首页 › 结构体指针作为参数会改变实参吗 › C语言 指针 【“空指针”传参问题】 |
再谈一谈空指针传参。写平衡二叉树时,因为传递进去了一个结点,而结点指向空,所以无论其他地方怎么改,都频频报错。 一、普通指针对于普通指针,我们要分清如果一个指针本身是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 |