【问题标题】: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
}

【问题讨论】:

  • 该赋值语句的左侧是.... 不是左值。还是错误消息中没有明确说明。

标签: c pointers struct variable-assignment lvalue


【解决方案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()
    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2014-08-23
    • 2019-03-18
    相关资源
    最近更新 更多