2.18. Как инкрементировать char*, словно он указывает на int
От: Кодт Россия  
Дата: 18.08.04 10:44
Оценка: -1
#Имя: FAQ.c.2.18
Вопрос: У меня определен указатель на char, который указывает еще и на int, причем мне необходимо переходить к следующему элементу типа int.
Почему
((int *)p)++;

не работает?

Ответ:
В языке С оператор преобразования типа не означает "будем действовать так, как будто эти биты имеют другой тип"; это оператор, который действительно выполняет преобразования, причем по определению получается значение типа rvalue, которому нельзя присвоить новое значение и к которому не применим оператор ++. (Следует считать аномалией то, что компиляторы pcc и расширения gcc вообще воспринимают выражения приведенного выше типа.).

Скажите то, что думаете:
p = (char *)((int *)p + 1);

или просто
p += sizeof(int);


Смотри:
ANSI Разд.3.3.4;
Rationale Разд.3.3.2.4 c. 43.



Примечание:

Ещё можно сделать то же самое через указатель на указатель
(*(int**)(&p))++;

поскольку результат разыменования — это lvalue, и к нему применимы присваивание и инкремент.
-- Кодт
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.