Segfault на IA-64, но не на IA-32 - PullRequest
6 голосов
/ 22 марта 2011

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

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

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

Ответы [ 3 ]

8 голосов
/ 22 марта 2011

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

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

2 голосов
/ 22 марта 2011

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

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

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

Возможно, проблема с указанием 64-битного указателя на 32 бита.

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

1 голос
/ 22 марта 2011

Поскольку это IA64 (курсив), а не x64, вероятно, что-то базовое, например malloc, не гарантирующее выравнивание, ср. memalign и более ранние версии IA64 не поддерживают доступ к памяти без выравнивания.

...