проблемы с массивом символов = массивом символов - PullRequest
4 голосов
/ 26 сентября 2011

У меня есть:

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

Когда я пытаюсь сделать message1 = message2, я получаю ошибку:

несовместимые типы при назначении типу ‘char[100]’ из типа ‘char *’

У меня есть такие функции, как

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

между ними.Могут ли эти вещи что-то испортить?: (

У меня такое чувство, что ты не можешь сделать = с массивами символов или чем-то еще, но я оглянулся и ничего не смог найти.

Ответы [ 2 ]

11 голосов
/ 26 сентября 2011

Вы не можете ничего присвоить переменной массива в C . Это не «изменяемое значение». Из спецификации, §6.3.2.1 L-значения, массивы и обозначения функций :

lvalue - это выражение с типом объекта или неполным типом, отличным от void; если lvalue не обозначает объект при его оценке, поведение не определено. Когда говорят, что объект имеет определенный тип, тип определяется значением l, используемым для обозначения объекта. модифицируемое значение lvalue - это значение lvalue, которое не имеет типа массива, не имеет неполного типа, не имеет типа с константой, и если это структура или объединение, не имеет какого-либо члена ( включая, рекурсивно, любой элемент или элемент из всех содержащихся агрегатов или объединений) с типом, определенным const.

Сообщение об ошибке, которое вы получаете, немного сбивает с толку, потому что массив в правой части выражения превращается в указатель перед присваиванием. То, что у вас есть, семантически эквивалентно:

message1 = &message2[0];

Что дает тип правой стороны char *, но, поскольку вы все еще не можете назначить что-либо для message1 (это массив типа char[100]), вы получаете ошибку компилятора, которую видите. Вы можете решить свою проблему, используя memcpy(3):

memcpy(message1, message2, sizeof message2);

Если вы по какой-то причине действительно настроили свое сердце на использование =, вы можете использовать массивы внутри структур ... хотя на самом деле это не рекомендуемый путь.

1 голос
/ 26 сентября 2011

Ваши подозрения верны.C (я предполагаю, что это C) рассматривает переменную массива как указатель.

Вам необходимо прочитать FAQ C о массивах и указателях: http://c -faq.com / aryptr / index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...