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 не поддерживают равноудаленный доступ к памяти.