2016-11-14 6 views
0

В C, я кодирования этоПочему нельзя назначить указатель на массив?

char * real = strdup("GEORGE"); 
char one[1024]; 
one = real; 

и дает ошибку:

invalid initializer

какие-либо предложения? Есть ли шанс, что я могу сделать массив символов равным указателю на char?

+1

Попробуйте 'STRCPY (один, реальный);'. –

+0

И BTW, вы также можете написать 'char one [] =" GEORGE "'. –

+0

Связано: [Почему не могут быть назначены массивы того же типа и размера?] (Http://stackoverflow.com/questions/14826952/why-cant-arrays-of-same-type-and-size-be-assigned) –

ответ

3

В вашем коде one является переменной типа массива. Таким образом,

one = real; 

При попытке присвоить тип массива, который недопустим.

Чтобы уточнить, имена массивов не являются модифицируемыми lvalues, а оператор присваивания работает только с изменяемыми значениями lvalues ​​как операндом LHS.

Цитирование C11, глава §6.5.16

An assignment operator shall have a modifiable lvalue as its left operand.

, а затем, глава §6.3.2.1 (emphais рудник)

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.

Вы должны использовать strcpy(), чтобы скопировать содержимое к массиву.

3

C требует констант в инициализаторах массива. Вы имеете право сделать это:

char one[1024] = "GEORGE"; 

или это

char one[1024] = {'G','E','O','R','G','E'}; 

но назначая указатель на массив является не разрешается ни при каких обстоятельствах, инициализаторе или нет.

С другой стороны, вы можете копия содержание указателя char в массив. В зависимости от того, ваш исходный массив заканчивается нулем или нет, вы можете использовать strcpy или memcpy, например:

strcpy(one, real); 

или

memcpy(one, real, 7); 
+1

Очень верно, сэр, но уверены ли мы, что OP хочет _initialization_? из фрагмента, это больше похоже на собеседование со мной. –

+0

@SouravGhosh Описание ошибки «invalid initializer» предполагает, что фрагмент кода, показанный в OP, не совсем то, чего он пытается достичь в реальном коде. Вот почему я начал с инициализации, прежде чем закрывать «невозможное назначение». – dasblinkenlight

+0

верно, что, согласитесь. –

Смежные вопросы