Я не могу получить доступ к моей исходной учетной записи . Модераторам требуется объединить учетные записи, если это возможно.
Вот мой вопрос. Следующие C-программы se-ошибок IA-64, но отлично работают на IA-32.
int main() { int* p; p = (int*)malloc(sizeof(int)); *p = 10; return 0; }
Почему это так происходит?
В C возвращаемый по умолчанию тип – int
если функция не прототипирована. В ia64 размер указателя больше, чем int, и поэтому он может segfault.
Обновление . Вопрос в том, почему вы всегда должны прототипировать свои функции (или включать соответствующие заголовки, если на то пошло).
Одной из причин, о которых я мог думать, является то, что прототип malloc
отсутствует, учитывая компилятор pre 99.
Неявный int (тип возврата) устарел. Однако, если ваш код segfaults означает, что компилятор предполагает, что функции (без какого-либо прототипа в области) возвращают целое число по умолчанию. В результате malloc
будет рассматриваться как возrotation целого числа вместо указателя.
В 32-битных реализациях sizeof(int)
и sizeof(void*)
– 32 бита каждый. В 64-битных реализациях sizeof(int)
все тот же, но sizeof(void*)
– 64 бит.
Это может привести к прочтению 64-битного указателя на 32 бита.
Включите
чтобы решить проблему.
Поскольку это IA64 (itanic), а не x64, это, вероятно, нечто основное, как malloc
не гарантирующее выравнивание, ср. memalign
и ранние версии IA64 не поддерживают неприглаженный доступ к памяти.