Segfault на IA-64, но не на IA-32

Я не могу получить доступ к моей исходной учетной записи. Модераторам требуется слияние учетных записей, если это возможно.
Вот мой вопрос. Следующие C-программы se-ошибок IA-64, но отлично работают на IA-32.

int main()
  {
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
  }

Почему это так происходит?

Ответы

Ответ 1

В C тип возвращаемого по умолчанию int, если функция не прототипирована. В ia64 размер указателя больше, чем int, и поэтому он может segfault.

Обновить. Вопрос в основном заключается в том, почему вы всегда должны прототипировать свои функции (или включать соответствующие заголовки, если на то пошло).

Ответ 2

Одна из причин, о которых я мог думать, заключается в том, что прототип malloc отсутствует, учитывая компилятор pre 99.

Неявный int (возвращаемый тип) устарел. Однако, если ваш код segfaults означает, что компилятор предполагает, что функции (без какого-либо прототипа в области) возвращают целое число по умолчанию. В результате malloc будет рассматриваться как возвращение целого числа вместо указателя.

В 32-битных реализациях sizeof(int) и sizeof(void*) - по 32 бита. В 64-битных реализациях sizeof(int) все тот же, но sizeof(void*) - 64 бит.

В результате этой проблемы может возникнуть вызов 64-разрядного указателя на 32 бита.

Включите <stdlib.h>, чтобы решить проблему.

Ответ 3

Как и IA64 (itanic), а не x64, возможно, что-то вроде malloc не гарантирует выравнивание, ср. memalign, а ранние версии IA64 не поддерживают равноудаленный доступ к памяти.