如何重新分配结构指针

时间:2016-02-10 16:09:01

标签: c pointers struct

我试图在名为'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;
}

2 个答案:

答案 0 :(得分:2)

此处的问题是ricknameChanger函数的本地问题。一旦函数执行完毕,rick将不复存在。因此,返回的指针和任何引用都将无效。

您可以使rick指针,并使用malloc()和系列分配内存。这样,分配的内存的生存期将一直到内存为free() - d,因此在返回后,访问将是有效的。

答案 1 :(得分:2)

你需要知道你的局部变量rick是在函数nameChanger()的堆栈帧上分配的,当函数返回时,内存不再有效,你不应该使用那个地址在功能之外。

如果您需要这样做,请改用malloc(),或将变量声明为任何函数之外的全局变量。

尝试了解进程的内存布局,特别是有关堆栈和放大器的内存布局。在你的情况下发挥作用。