6

I have:

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

When I try to do message1 = message2, I get error:

incompatible types when assigning to type ‘char[100]’ from type ‘char *’

I have functions like

if(send(clntSocket, echoBuffer, recvMsgSize, 0) != recvMsgSize){
   DieWithError("send() failed")
}

inbetween. Could these mess things up somehow? :(

I have a feeling maybe you can't do = on char arrays or something, but I looked around and couldn't find anything.

1
  • are you using the C++ compiler? Commented Sep 25, 2011 at 20:37

2 Answers 2

14

You can't assign anything to an array variable in C. It's not a 'modifiable lvalue'. From the spec, §6.3.2.1 Lvalues, arrays, and function designators:

An lvalue is an expression with an object type or an incomplete type other than void; if an lvalue does not designate an object when it is evaluated, the behavior is undefined. When an object is said to have a particular type, the type is specified by the lvalue used to designate the object. A modifiable lvalue is an lvalue that does not have array type, does not have an incomplete type, does not have a const-qualified type, and if it is a structure or union, does not have any member (including, recursively, any member or element of all contained aggregates or unions) with a const-qualified type.

The error message you're getting is a bit confusing because the array on the right hand side of the expression decays into a pointer before the assignment. What you have is semantically equivalent to:

message1 = &message2[0];

Which gives the right side type char *, but since you still can't assign anything to message1 (it's an array, type char[100]), you're getting the compiler error that you see. You can solve your problem by using memcpy(3):

memcpy(message1, message2, sizeof message2);

If you really have your heart set on using = for some reason, you could use use arrays inside structures... that's not really a recommended way to go, though.

Sign up to request clarification or add additional context in comments.

Comments

2

Your suspicions are correct. C (I'm assuming this is C) treats an array variable as a pointer.

You need to read the C FAQ about arrays and pointers: http://c-faq.com/aryptr/index.html

1 Comment

More precisely, an expression of array type (such as the name of an array variable) is implicitly converted, in most contexts, to a pointer to the first element of the array object. But +1 for citing my favorite section of the FAQ.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.