我试图在名为'nameChanger'的函数中重新分配Person指针,我做错了什么?如何重新指定Person
指针,指向另一个Person
?
#include <stdio.h>
#include <string.h>
typedef struct {
int age;
char name[50];
} Person;
void nameChanger(Person ** person);
int main() {
Person brian;
brian.age = 27;
strcpy(brian.name, "brian");
Person * brian_pointer = &brian;
nameChanger(&brian_pointer);
printf("changing name to 'rick' : %s\n", brian_pointer->name); // should be 'rick'
return 0;
}
void nameChanger(Person ** person){
Person rick;
rick.age = 50;
strcpy(rick.name, "rick");
Person * rick_p = &rick;
*person = &rick;
}
答案 0 :(得分:2)
此处的问题是rick
是nameChanger
函数的本地问题。一旦函数执行完毕,rick
将不复存在。因此,返回的指针和任何引用都将无效。
您可以使rick
指针,并使用malloc()
和系列分配内存。这样,分配的内存的生存期将一直到内存为free()
- d,因此在返回后,访问将是有效的。
答案 1 :(得分:2)
你需要知道你的局部变量rick
是在函数nameChanger()
的堆栈帧上分配的,当函数返回时,内存不再有效,你不应该使用那个地址在功能之外。
如果您需要这样做,请改用malloc()
,或将变量声明为任何函数之外的全局变量。
尝试了解进程的内存布局,特别是有关堆栈和放大器的内存布局。在你的情况下发挥作用。