Приведение int указателя на char ptr и наоборот - PullRequest
14 голосов
/ 27 ноября 2010

Проблема проста.Как я понимаю, GCC утверждает, что символы должны быть выровнены по байту и выровнены по 4 байта в 32-битной среде.Мне также известен стандарт C99 6.3.2.3, в котором говорится, что приведение между неправильно выровненными типами указателей приводит к неопределенным операциям.Что другие стандарты Си говорят об этом?Здесь также есть много опытных программистов - любой взгляд на это будет оценен.

int *iptr1, *iptr2;
char *cptr1, *cptr2;

iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;

Ответы [ 3 ]

12 голосов
/ 30 ноября 2010

Существует только один стандарт для C (один от ISO), с двумя версиями (1989 и 1999), плюс несколько довольно незначительных изменений.Все версии и редакции согласны со следующим:

  • вся память данных адресуется байтами, а символы являются байтами
  • , таким образом char* сможет обращаться к любым данным
    • void* совпадает с char*, за исключением того, что для преобразования в него и из него не требуется приведение типов
  • преобразование из int* в char* всегда работает, так какдействительно ли преобразование обратно в int*
  • преобразование произвольного char* в int* не гарантированно работает

Причины, по которым указатели на символы гарантированно работают так, чтоВы можете, например, копировать целые числа из любой точки памяти в другое место в памяти или на диск и обратно, что оказывается довольно полезным делом в низкоуровневом программировании, например, в графических библиотеках.

4 голосов
/ 27 ноября 2010

Есть процессоры с прямым и прямым порядком байтов для процессоров, поэтому результаты не определены.Например, значение 0x01234567 может быть 0x12 или 0x67 для указателя на символ после приведения.

0 голосов
/ 16 февраля 2013

Вы можете попробовать сделать:

iptr1 = atoi(cptr1); // val now = pointed by cptr1
cptr2 = atoi(iptr2); // val now = pointed by iptr2

Это сработало для меня в DevCpp!

...