lvalue, требуемый как инкрементный операнд

gcc 4.4.4

Что я делаю неправильно?

char x[10];
char y[] = "Hello";
while(y != NULL)
    *x++ = *y++;

Большое спасибо за любой совет.

24
задан MD XF 29 October 2016 в 02:22
поделиться

5 ответов

x ++ - это сокращенная форма x = x + 1 . Однако x здесь является массивом, и вы не можете изменить адрес массива. То же самое и с вашей переменной y .

Вместо того, чтобы пытаться увеличивать массивы, вы можете объявить целое число i и увеличить его, а затем получить доступ к i -ому индексу массивов.

char x[10], y[5] = "Hello";
int i = 0;
while (y[i] != 0)
{
    x[i] = *y[i];
    i++;
}
x[i] = 0;
29
ответ дан 28 November 2019 в 22:34
поделиться
char x[10];
char y[] = "Hello";
char *p_x = &x[0];
char *p_y = &y[0];
while(*p_y != '\0') *p_x++ = *p_y++;

Поскольку вы не можете изменять адреса массива (выполняются с помощью x ++ и y ++ в вашем коде), а вы можете изменять адрес указателя, я скопировал над адресом массива на отдельные указатели и , затем увеличили их.

Если хотите, я уверен, что вы можете сократить обозначения, но я надеюсь, что вы уловили суть.

5
ответ дан 28 November 2019 в 22:34
поделиться

Поскольку вы определили как x , так и y как массивы, вы не можете их изменять. Одна из возможностей - использовать вместо них указатели:

char x[10];
char *xx = x;

char *y = "Hello";

while (*y != '\0')
    *xx++ = *y++;

Обратите внимание, что я также исправил ваше условие завершения - указатель не станет NULL только потому, что он достиг конца строки.

1
ответ дан 28 November 2019 в 22:34
поделиться

x и y - это массивы, а не указатели.

Они распадаются на указатели в большинстве контекстов выражений, таких как ваше выражение приращения, но они распадаются на r-значения, а не l-значения, и вы можете применять только операторы приращения к l-значениям.

3
ответ дан 28 November 2019 в 22:34
поделиться

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

Код не "работает", потому что в действительности массивы не являются указателями. Массивы - это массивы. Массивы не могут быть увеличены. В языке Си нет такой операции, как "увеличить массив". Фактически, массивы сами по себе в языке Си являются немодифицируемыми значениями. В языке Си нет операций, которые могут изменять сам массив (изменяемыми могут быть только отдельные элементы).

Если вы хотите обходить свои массивы, используя технику "скользящего указателя" (что вы, собственно, и пытаетесь сделать), вам нужно явно создать указатели и сделать их указывающими на начальные элементы ваших массивов

char *px = x;
char *py = y;

После этого вы можете увеличивать эти указатели сколько угодно.

23
ответ дан 28 November 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: