字符数组问题 = 字符数组

5

我有:

char message1[100];
char message2[100];

当我尝试执行message1 = message2时,出现错误:

将类型为'char *'的值分配给类型为'char[100]'的对象无法兼容

我有以下函数:
if(send(clntSocket, echoBuffer, recvMsgSize, 0) != recvMsgSize){
   DieWithError("send() failed")
}

在中间。这些会不会弄乱事情呢?:(

我有一种感觉,也许你不能在字符数组上执行=操作,但我找了一下,没有找到任何东西。


你在使用C++编译器吗? - Preet Sangha
2个回答

13
在C语言中,你不能将任何东西分配给数组变量。它不是一个“可修改的lvalue”。根据规范§6.3.2.1 Lvalues, arrays, and function designators

lvalue是具有对象类型或不完全类型(除了void)的表达式;如果在评估时lvalue没有指定对象,则行为是未定义的。当说一个对象具有特定类型时,类型由用于指定该对象的lvalue指定。可修改的lvalue是一个没有数组类型、没有不完全类型、没有const限定类型的lvalue,如果它是结构体或联合体,则没有任何成员(包括递归地包含的所有聚合体或联合体的任何成员或元素)具有const限定类型。

你得到的错误消息有点令人困惑,因为赋值表达式右侧的数组在赋值之前会衰减为指针。你所拥有的与语义上等效的是:

message1 = &message2[0];

这会给出右侧类型为char *,但由于您仍然无法将任何内容分配给message1(它是一个数组,类型为char [100]),因此您会看到编译器错误。您可以通过使用memcpy(3)来解决问题:

memcpy(message1, message2, sizeof message2);

如果你真的因为某些原因非常想使用=,你可以在结构体内部使用数组...不过这并不是推荐的方式。


2
你的猜想是正确的。C语言(我假设这是C语言)将数组变量视为指针。
你需要阅读关于C语言数组和指针的FAQ:http://c-faq.com/aryptr/index.html

1
更准确地说,数组类型的表达式(例如数组变量的名称)在大多数情况下会被隐式转换为指向数组对象第一个元素的指针。但是因为引用了我最喜欢的FAQ章节,所以加一分。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接