LINUX.ORG.RU

lvalue required as increment operand

 


0

1
case 'a': 
{ void *p; int i, n = 1;
    if (sscanf(&(buffer[offset]), "%x +%d", &p, &n) == 2) ;
        else if (sscanf(&(buffer[offset]), "%x", &p) == 1) ;
          else p = SP;
    for (i = 0; i < n; ((int *)p)++, i++) printf("%X: %X\n", p, *(int *)p);
    break;
}

Ругается на ((int *)p)++

Это кусок виртуальной машины с дебагером, что по команде 'a' выдает содержимое памяти по адресу p.

gcc-4.9 -std=c90/c89



Последнее исправление: panzerito (всего исправлений: 1)

Можно заменить на:

p = (int *)p + 1

А вообще лучше объявить дополнительную переменную типа int * и работать с ней.

xaizek ★★★★★
()
Ответ на: комментарий от panzerito

Но она void *, а с переменной типа int * касты будут не нужны.

xaizek ★★★★★
()

printf("%X: %X\n", p

UB. Для %X должен передаваться unsigned int, а не void*

anonymous
()

В scanf аналогичное UB.

anonymous
()

Правильно ругается. Каст указателя — далеко не всегда NOP (хотя в этом, простом случае — таки да), так что считать его lvalue в общем случае нельзя.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Каст вообще никогда не lvalue. При чём тут NOP и «считать»?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.