【问题标题】:How do I initialize members of a struct that is pointed to by a pointer?如何初始化指针指向的结构的成员?
【发布时间】:2015-10-20 06:32:59
【问题描述】:

我在 C 中有以下结构:

typedef struct
{
    int age;
    char name[20];  
} Person;

main()我有:

Person *person;

person->age = 21;

这会导致分段错误,我尝试了谷歌搜索,但我发现的资源没有将结构声明为指针。我需要将此结构声明为指针,以便可以将其传递给另一个函数。我将如何正确访问该结构的成员? (我也需要为char 这样做)。

【问题讨论】:

  • 你需要先为结构体分配空间。使用malloc()

标签: c pointers struct


【解决方案1】:

这相当简单,声明一个指向结构的指针,然后使用malloc 分配并分配/复制值:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int age;
    char name[20];  
} Person;

void agingfunction (Person **p)
{
    (*p)->age = 25;
}

int main (void) {

    Person *p = malloc (sizeof *p);
    if (!p) return 1;

    p->age = 5;
    strncpy (p->name, "Charles Darwin", 20);

    printf ("\n %s is %d years old.\n", p->name, p->age);

    agingfunction (&p);

    printf ("\n %s is now %d years old.\n", p->name, p->age);

    free (p);

    return 0;
}

输出

$ ./bin/structinit

 Charles Darwin is 5 years old.

 Charles Darwin is now 25 years old.

【讨论】:

  • 感谢您提供此示例!
  • 当然,很高兴我能帮上忙。一旦你看到所有的部分放在一起,它就开始有意义了。
【解决方案2】:

您需要在某处为结构分配内存。如果你有一个像void func (Person* p); 这样的函数,那么你可以像这样向它传递一个结构体:

Person person;
func(&person);

或同等的:

Person person;
Person* ptr = &person;
func(ptr);

【讨论】:

    【解决方案3】:

    你必须为你的结构实例分配内存:

    Person *person = malloc(sizeof(Person));
    

    否则你也可以声明为

    Person person;
    

    并将值赋值为,

    person.age = 21;
    

    【讨论】:

      【解决方案4】:

      主要做:

      Person *person=malloc (1 * sizeof (Person ));
      person->age = 21;
      

      您需要在内存中为您的对象分配一个真实的位置。然后,你就可以处理它了

      【讨论】:

        【解决方案5】:

        如果要使用这个指针,需要先用malloc分配内存。像这样:

        Person *person = malloc(sizeof(Person));
        

        但在您的代码中,您也可以不使用指针,方法是正常声明 person,如下所示:

        Person pers;
        pers.age = 21;
        Person* pointer = &pers;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-22
          • 1970-01-01
          相关资源
          最近更新 更多