C语言中在函数内修改结构体指针内容失败,该如何正确实现?
问题根因
C语言所有参数都是值传递,你向enter函数传入的是person_1指针本身的副本,函数内部给struct_pointer赋值malloc返回的地址,只会修改副本的指向,完全不会影响外部的person_1变量。因此函数执行完成后,person_1仍然是NULL,后续执行person_1->code属于访问空指针,会触发段错误,自然没有正常输出。
解决方法
该需求完全可以实现,常用有两种修改方案:
方案1:传入二级指针修改原指针
把外部指针的地址传入函数,通过解引用二级指针直接修改原指针的指向,修改后代码如下:
#include <stdio.h> #include <stdlib.h> typedef struct { int age; int code; }person; // 参数改为二级指针,接收外部指针的地址 void enter(person **struct_pointer); // 标准写法建议用int main而非void main int main(void) { person *person_1 = NULL; // 传入person_1的地址 enter(&person_1); printf("CODE: %i\n", person_1->code); free(person_1); return 0; } void enter(person **struct_pointer) { // 先解引用一层拿到外部原指针,再给它赋值malloc的地址 *struct_pointer = malloc(sizeof(**struct_pointer)); // 判空是好习惯,避免malloc失败触发野指针 if(*struct_pointer == NULL) { return; } (*struct_pointer)->age = 10; (*struct_pointer)->code = 5090; }
方案2:函数返回初始化完成的结构体指针
直接让enter函数分配内存、初始化后把指针返回,由外部变量接收即可,代码更简洁:
#include <stdio.h> #include <stdlib.h> typedef struct { int age; int code; }person; // 函数返回值改为person*类型 person* enter(void); int main(void) { person *person_1 = enter(); if(person_1 != NULL) { printf("CODE: %i\n", person_1->code); free(person_1); } return 0; } person* enter(void) { person *p = malloc(sizeof(*p)); if(p == NULL) { return NULL; } p->age = 10; p->code = 5090; return p; }
内容的提问来源于stack exchange,提问作者Luigi_S_R
相关产品推荐
相关产品推荐

