Выделение указателя int на char ptr и наоборот

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

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

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

Ответ 1

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

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

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

Ответ 2

Для процессоров есть big-endian и little-endian, поэтому результаты undefined. Например, значение 0x01234567 может быть 0x12 или 0x67 для указателя char после кастинга.

Ответ 3

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

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

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