将char *分配给另一个char *

时间:2014-08-25 14:32:25

标签: c string pointers struct

我有一组struct指针,每个struct内是另一个struct,其中包含一个名为firstname的字段,firtstname是char *. {当程序首次运行以形成链接列表时,{1}}将填充文件中的数据。我的定义如下......

struct

我从用户那里得到一个字符串输入并将其存储在char *中(它指向与原始内存大小相同的内存块),现在我想要查找由

访问的char *
struct person 
{
  char *firstname;
  char *lastname;
};

struct node
{
  struct person employee;
  struct node *next;
};

struct node *nodes[MAX_NODES];

到char *我刚刚从用户那里读到。我试过了

nodes[index]->data.firstname

使用printf()对上面的内容进行了测试,但它似乎有效,但是稍后打印出数据会打印旧数据。这是为什么?

2 个答案:

答案 0 :(得分:2)

最有可能的是,你有两个指向同一块内存的指针。

您可能希望使用malloc()为复制的字符串分配额外内存,然后使用strcpy()strncpy()将原始字符串复制到该新内存块。

答案 1 :(得分:0)

由于数组未意外更改为新值,但恢复为“旧”值,我认为问题实际上是按值参数传递。

您要将结构的实例传递给函数并在其中修改其firstname指针。然后,它(显然)在函数的其余部分中具有正确的值,但是一旦函数退出就不再有。

解决方案是将指针传递给您的结构。指针被复制到函数内部,两个副本自然指向同一个对象,然后您可以在函数内修改它。

void changeByVal(struct person person) {
    person.firstname = malloc(FIRST_NAME_LEN);
    strcpy(person.firstname, "John Doe");
}

void changeByPtr(struct person *person) {
    person->firstname = malloc(FIRST_NAME_LEN);
    strcpy(person->firstname, "John");
}

int main(int argc, char **argv) {
    struct person p1, p2;

    p1.firstname = "Jane";

    changeByVal(p1);
    changeByref(p2);

    // Prints "We have Jane and John" instead of "John and John"
    printf("We have %s and %s", p1.firstname, p2.firstname);
}