将指向结构的指针分配给变量

Posted

技术标签:

【中文标题】将指向结构的指针分配给变量【英文标题】:Assigning a pointer to a struct to a variable 【发布时间】:2013-01-21 03:03:17 【问题描述】:

我在主程序中使用 make_employee 函数返回的指针时遇到问题。

// 我在一个单独的 .c 文件中有以下代码:

struct Employee;

struct Employee* make_employee(char* name, int birth_year, int start_year)
  struct Employee* new = (struct Employee*)malloc(sizeof(struct Employee));
  strcpy(new->name, name);
  new->birth_year = birth_year;
  new->start_year = start_year;
  return new;



//In the main program:

int main()

  char test_name[] = "Fred";
  int test_birth = 1989;
  int test_start = 2007;

  Employee Fred;

  make_employee(test_name, test_birth, test_start) = &Fred;     <-- throws invalid lvalue error

  return 0

【问题讨论】:

该赋值语句的左侧是.... 不是左值。还是错误消息中没有明确说明。 【参考方案1】:

我认为你需要检查你的 make_employee 函数。我这么说的原因是在您发布的代码中,您使用以下行

struct Employee* new = (struct Employee*)malloc(sizeof(struct Employee));

new 是 C++ 中的关键字,如果您使用过 C++ 编译器,应该会立即引发编译错误。使用关键字作为变量名是不好的。

还要检查函数的返回值。

假设你已经正确声明了你的结构,这应该可以正常工作

struct Employee* make_employee(char* name, int birth_year, int start_year)
  struct Employee *ptr = (struct Employee*)malloc(sizeof(struct Employee));
  strcpy(ptr->name, name);
  ptr->birth_year = birth_year;
  ptr->start_year = start_year;
  return ptr;



//In the main program:

int main()

  char test_name[] = "Fred";
  int test_birth = 1989;
  int test_start = 2007;

  Employee *Fred = make_employee(test_name, test_birth, test_start) ;   

  printf("Printing the data contents");
  printf("\n Name : %s",Fred->name);
  printf("\n Birth : %d",Fred->birth_year);
  printf("\n Start :%d",Fred->start_year);
  free(Fred);
  return 0;

【讨论】:

【参考方案2】:

您不能将某些内容分配给非左值。因此名称(左值,左侧值,可以出现在赋值表达式的left 侧)。

是你想要做的吗??

int main()

  char test_name[] = "Fred";
  int test_birth = 1989;
  int test_start = 2007;

  struct Employee *fred = make_employee(test_name, test_birth, test_start)

  // use fred....

  free(fred);

  return 0

注意:不要在 C 中强制转换 malloc()。确保 stdlib.h 包含在您的源文件中,如果您忘记这样做,编译器会警告您。如果您收到警告说“隐式声明malloc 返回int”等,这意味着您忘记包含stdlib.h,您应该这样做。

【讨论】:

是的,这就是我想要做的。我在这一行收到警告(从不兼容的指针类型初始化):struct Employee *fred = make_employee(test_name, test_birth, test_start); 尝试struct Employee* make_employee(const char* name, int birth_year, int start_year) 进行函数声明。此外,请确保它是原型或在同一源文件中声明 above main()

以上是关于将指向结构的指针分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将结构中的 void 指针分配给另一个结构?

c语言如何给结构体指针赋值?

Swig:将成员变量(指向值的指针)转换为 python 列表

在C中为结构指针数组成员分配地址

如何将变量结构类型传递给 C 中的函数

quiz 3