Ошибка: выражение должно быть модифицируемым lvalue при попытке изменить расположение указателя char*

Я пишу небольшую функцию на C, которая устраняет начальные пробелы, но это дает мне «выражение должно быть модифицируемым lvalue»

char str1[20];
strcpy (str1, otherStr);

for (int i = 0; i < strlen(str1); i++)
{
    if (!isspace(str1[i]))
        str1 = &(str1[i]);
}

Что я здесь делаю неправильно? (И да, otherStr определен)


person user2824889    schedule 05.02.2015    source источник
comment
Вы не можете изменить расположение массива, он статически выделяется компилятором во время компиляции. Это правда, что массивы разлагаются на указатели, но они не являются указателями. Если вы хотите использовать его как истинный указатель, вам нужно использовать фактический указатель.   -  person Some programmer dude    schedule 05.02.2015
comment
В вашем коде нет указателя char * . Массив не является указателем.   -  person AnT    schedule 05.02.2015


Ответы (2)


В вашем коде нет указателя char *, который можно было бы изменить. Массив не является указателем. Вы не можете «изменить» его местоположение.

В массивах языка C сами объекты являются неизменяемыми lvalue, отсюда и формулировка ошибки.

person AnT    schedule 05.02.2015
comment
&(str1[i]) это char *, я не уверен, что ОП это понимает. - person ouah; 05.02.2015

char *str1 = malloc(20);
// or
// char s[20];
// char * str1 = s; // note the lack &s
// or
// char *str1 = alloca(20);
strcpy (str1, otherStr);

for (int i = 0; i < strlen(str1); i++)
{
    if (!isspace(str1[i]))
        str1 = &(str1[i]);
}

Ваш код не работал, потому что когда char str1[20], то str1 не является переменной - для большинства целей это литерал указателя, аналогичный (void *)0x0342. Вы не можете сделать 0x0342 = 7;, поэтому вы также не можете назначить имя массива.

person nategoose    schedule 05.02.2015