Я понимаю, что стандарт C запрещает использование массивов в качестве (изменяемая) lvalues, то есть на левой стороне присваивания:Почему массивы не lvalues?
int lhs[4], rhs[4] = {0, 1, 2, 3};
lhs = rhs; /* illegal! */
Теперь, я задавался вопрос, почему это так , Я мог видеть заявление выше (и любое другое задание, которое записывает в массив) определяется эквивалентный
memcpy((void *) lhs, (void *) rhs, sizeof(lhs));
и налагая бремя обеспечения, что rhs
достаточно большой для пользователя, но это не было принято решение в этом должно быть так.
Однако, очень похожий пример делает работы прекрасно:
struct { int a[4]; } lhs, rhs = {{0, 1, 2, 3, 4}};
lhs = rhs;
Просто обертывание массива в структуре, можно получить именно поведение, описанное выше, то есть присвоение lhs = rhs
эквивалентно до:
memcpy((void *) &lhs, (void *) &rhs, sizeof(lhs));
В чем причина этого (как мне кажется) непоследовательности? Есть ли проблема с разрешающими назначениями массива, которые интерпретируются как memcpy
?
Ответ на этот вопрос: http://stackoverflow.com/a/17691191/14955 (Прокрутите вниз до Edit2: The Real Reason) – Thilo
Имя массива * is * lvalue. Я думаю, что вы спрашиваете, почему массивы не назначаются. –
Возможный дубликат: http://stackoverflow.com/q/27881442/827263 –