Переносимость кода C - PullRequest
4 голосов
/ 11 марта 2010

У меня есть следующий код

int main()
{
   int a=6;
   void *p;
   p=&a;
   p++;
}

Увеличивает ли указатель void здесь конкретное значение (если он содержит адрес любого типа данных)?

В приведенном выше случае p увеличивается на 1, даже если оно указывает на целочисленное значение. По моему мнению, приведенный выше код вызывает поведение Implementation Defined.

Ответы [ 3 ]

7 голосов
/ 11 марта 2010

Код не действителен со стандартной точки зрения C. Недопустимо увеличивать void * указатели или любые другие указатели до неполных типов.

Ваш компилятор реализует его как расширение, которое, конечно, непереносимо.

5 голосов
/ 11 марта 2010

Применение оператора ++ к void* является расширением GCC, которое, как мне сказали, делает некоторые вещи более удобными для программирования очень низкого уровня (в принципе, не нужно так много приводить). Я не думаю, что когда-либо сталкивался с ситуацией, когда я серьезно не хочу бросать на unsigned char*.

Используйте флаг -pedantic, если вы пишете код, который должен быть переносимым.

1 голос
/ 11 марта 2010

Рядом с ответом AndreyT :

Взгляните на stdint.h , который делает ваш код более переносимым.

...