我在C中模拟继承,但我对语言并不熟悉。下面是一些代码。 Visual Studio有emp.name=n
的错误消息,其中包含:
表达式必须是可修改的左值。
如何更改它以便修改?
typedef struct {
char name[20];
double salary;
} Employee;
Employee newEmployee(char n[], double s)
{
Employee emp;
emp.name=n;
emp.salary=s;
return emp;
}
答案 0 :(得分:5)
您需要将数据从n
复制到Employee.name
:
strncpy(emp.name, n, 20);
但是,如果n
不以NULL结尾,则会遇到问题。使用以下代码来保证emp.name
将是以NULL结尾的字符串:
strncpy(emp.name, n, 19);
emp.name[19] = '\0';
答案 1 :(得分:1)
您必须使用strcpy()
或亲戚(strncpy()
,memmove()
,memcpy()
,...)来复制C中的字符串。
strcpy(emp.name, n);
这假设n
中字符串的长度短于Employee结构中的name
。如果不是,那你就遇到了问题。
答案 2 :(得分:1)
其他海报是正确的,引导你使用strncpy。
围绕strcpy vs strncpy的注释出现是因为strcpy要求其src字符缓冲区为空终止,即。最后一个字符必须是一个'\ 0'字符。如果不遵循此约定,则程序会因分段错误而意外终止。当发生这种情况时,这简直令人尴尬。
您收到的错误消息指出,通过尝试将分配 char []到emp.name,您试图修改struct中name元素的地址< / em>的。无法修改内存地址;所以问题的答案就是 emp.name永远不会被修改,因为它是内存中的一个地址,你不能改变它。
所以在你的脑海里,你认为我想修改 emp.name作为char数组n中的数据,但是emp.name的地址是不可修改。 strncpy会将char数组n中包含的数据复制到emp.name地址指向的20个字节。
我可能没有很好地解释这一点,请问更多问题。其他海报可以纠正或改进这个答案。
这是学习C的棘手部分;研究一些汇编语言是很有用的,并且要记住,当你用C编码时,你就是编写汇编程序的C语言关键字层,这就是为什么它快速且容易出错的原因。