更新struct

时间:2016-02-05 11:52:16

标签: c pointers struct

我在我的struct中有一个char *字段(name),我尝试通过p_update函数更新它,它什么都不返回(空白),那么如何更新char *?

#include <stdio.h>
//------------------------------------------
typedef struct{
    char *name;
    int age;
    }person;
void p_info(person *);
void p_update(person *);
//------------------------------------------
int main(void){
    person p1={"bob",22};
    p_info(&p1);
    p_update(&p1);
    p_info(&p1);
    return 0;
    }
//------------------------------------------
void p_info(person *p){
    printf("Name: %s\tAge: %i\n",p->name,p->age);
    }
void p_update(person *p){
    char name[10];
    scanf("%9s",name);
    p->name=name;
    }

2 个答案:

答案 0 :(得分:3)

  

那么如何更新char *?

你快到了。

而不是p->name=name;使用strcpy代替:

strcpy( p.name, name );   // Note use this with modified `person` struct below.

原因是您不能对字符串类型使用简单赋值 - 为此需要strcpy#include <string.h>

您的person结构也需要处理,因为name是未初始化的指针。最好使用数组。

typedef struct{
            char name[10];
            int age;
        } person;

出于同样的原因,您需要声明并初始化您的结构,如下所示:

// person p1={"bob",22};    // <-- WRONG
person p1 = {};
strcpy(p1.name, "bob");
p1.age = 22;

如果坚持使用name作为字符指针,那么在使用之前需要额外的步骤来分配内存。

main()

// person p1={"bob",22};    // <-- WRONG
person p1 = {};
p1.name = malloc(20 * sizeof(char));
strcpy(p1.name, "bob");
p1.age = 22;

p_update()

// p->name=name;    // WRONG
p->name = malloc(20 * sizeof(char));
strcpy( p->name, name );

或者(正如pelya指出的那样),在这里使用单个strdup会更容易,因为它等同于malloc + strcpy

p->name = strdup(name);

答案 1 :(得分:3)

id完成后,p_update将从内存中消失。您需要将其声明为全局变量,或者分配新的内存块: char name[10];或仅p->name = (char *) malloc(10); strcpy(p->name, name);

将结构缓冲区直接放在结构中会更容易:

p->name = strdup(name);