C-赋值结构和字符数组中的不兼容类型

C-赋值结构和字符数组中的不兼容类型,c,pointers,struct,C,Pointers,Struct,好的,我的情况的要点是,当我试图初始化我的结构时,我在赋值中遇到了一个不兼容的类型。我是C语言的新手,理解指针对我来说是一个很大的挑战,但我已经研究了类似的问题,尝试了不同的修复方法,到目前为止还没有运气。如果有人能帮我解决这个问题,你就是我的英雄 struct Employee { char* name[100]; int birth_year; int starting_year; }; struct Employee* make_employee(char* name, i

好的,我的情况的要点是,当我试图初始化我的结构时,我在赋值中遇到了一个不兼容的类型。我是C语言的新手,理解指针对我来说是一个很大的挑战,但我已经研究了类似的问题,尝试了不同的修复方法,到目前为止还没有运气。如果有人能帮我解决这个问题,你就是我的英雄

struct Employee {

  char* name[100];
  int birth_year;
  int starting_year;
};

struct Employee* make_employee(char* name, int birth_year, int starting_year);

int main(){
//some main stuff code
}

struct Employee* make_employee(char* name, int birth_year, int starting_year){

struct Employee* newEmpl = (struct Employee*)malloc(sizeof(struct Employee));
 newEmpl->name = name;
 newEmpl->birth_year = birth_year;
 newEmpl->starting_year = starting_year;

  return newEmpl;
}
分配错误发生在name=name行。我不知道为什么。 如果我把那条线换成

strcpy(&(newEmpl->name), name);
我得到:

警告:从不兼容的指针类型传递“strcpy”的参数1


我花了两个小时试图找到问题,但运气不好,我想在这里试一试。

在你的结构中,改变一下

 char* name[100];   //an array of pointers to character

然后,在
make_employee()
函数中,而不是

 newEmpl->name = name;      //arrays cannot be assigned
使用

注:

  • 请不要强制转换
    malloc()
    和family的返回值
  • 在使用返回的指针之前,请检查
    malloc()
    和family是否成功
  • 是指向
    char
    的指针数组,但:

    char* name;
    
    是指向
    char
    的指针

    在这里:

    您正试图将指向
    char
    的指针分配给数组,但在C语言中无法将指针分配给数组!事实上,在C语言中,你不能给数组赋值


    检查您在程序中使用的类型是否正确。是否确实要使用
    char*name[100]和非
    字符名[100](字符数组)?然后,要复制字符串,请使用
    strcpy
    strncpy
    而不是
    =
    运算符,因为您无法将某些内容分配给数组。

    代码中的
    name
    是指针数组。也许你想拥有
    char name[100]
    ?甚至比strcpy更好,请使用
    char*strncpy(char*dest,const char*src,size\t n)
    和大小参数100,这样你就不会溢出字符串缓冲区。@fearless\u傻瓜谢谢,先生,但是大小应该是99以容纳终止的null。已更新。:-)嗯,我不同意应该是99,但我知道我错了。检查文档中的strncopy,并说明为什么您认为它应该是99.:)
    strncpy
    不放置终止null如果缓冲区中不适合,则必须编写代码来执行此操作。使用strncpy几乎总是一个糟糕的主意。我同意裸体strncpy是个坏主意(但strcpy更糟糕!)。您需要的是
    strncpy(newemp->name,name,BUFLEN);newemp->name[BUFLEN-1]='\0'
    强制最后一个字符为空。
    strcpy(newEmpl->name, name);    // copy the contains of name to newEmpl->name
    
    strncpy(newEmpl->name, name, 99);  // limit to 99 elements only + terminating null
    
    char* name[100];
    
    char* name;
    
    newEmpl->name = name;