Ошибка сегментации в C на Mac, прямое копирование из учебника - PullRequest
2 голосов
/ 09 марта 2011

Я начал изучать C и указатели, и я работал над учебными пособиями в Интернете.Я предполагаю, что код должен работать так, как он есть в руководстве, и он мне кажется правильным, но я получаю ошибку сегментации.Код:

#include <stdio.h>
#include <stdlib.h>

/*
 * 
 */
int main(int argc, char** argv) {
    float fl = 3.14;
    unsigned int addr = (unsigned int) &fl;
    printf("fl's address=%u\n", addr);
    printf("addr's contents = %.2f\n", * (float*) addr);
    return (EXIT_SUCCESS);
}

Я получаю ошибку:

/Applications/NetBeans/NetBeans       
6.9.1.app/Contents/Resources/NetBeans/ide/bin/nativeexecution/dorun.sh: line 33:  1626     
Segmentation fault      sh "${SHFILE}"

Это связано со мной при использовании Mac или что-то не так с кодом?

Большое спасибо, Niek

Ответы [ 6 ]

6 голосов
/ 09 марта 2011

Попробуйте вместо этого:

int main(int argc, char** argv) {
    float fl = 3.14;
    float *addr = &fl;
    printf("fl's address=%p\n", addr);
    printf("addr's contents = %.2f\n", *addr);
    return (EXIT_SUCCESS);
}
4 голосов
/ 09 марта 2011

Это может быть неопределенное поведение.Нет гарантии, что int и указатель могут содержать одно и то же значение, и вам не следует проводить между ними приведение.Вместо этого используйте float*.

C99 6.3.2.3/5 и /6 состояние:

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

6: любой тип указателя может быть преобразованк целочисленному типу.За исключением случаев, указанных ранее, результат определяется реализацией.Если результат не может быть представлен в целочисленном типе, поведение не определено.Результат не обязательно должен находиться в диапазоне значений любого целочисленного типа.

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

Да, адресное пространство указателя не обязательно совпадает с int.На самом деле этот код выдает мне следующие предупреждения компиляции с использованием gcc на Mac Pro:

test.c: 9: warning: приведение от указателя к целому числу другого размерауказатель от целого числа разного размера

, а также ошибка сегмента.Я бы рассмотрел код самплебии.

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

да под win7 + mingw32, код компилируется \ выполняется правильно

fl's address=2293572
addr's contents = 3.14

Я думаю, что это проблема только с MacOS

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

Код кажется правильным, компиляция с MinGW GCC и запуск дает следующий вывод:

fl's address=2293528
addr's contents = 3.14
0 голосов
/ 09 марта 2011

Проблема в размере int. Как уже сказал @paxdiablo, нет гарантии, что int достаточно большой, чтобы содержать то же значение, что и указатель. Вместо этого попробуйте long long, но имейте в виду, что код остается в неопределенном поведении corner.

...