Объявление переменных в C - PullRequest
1 голос
/ 15 июня 2011

Я пытаюсь объявить целочисленную переменную m и указатель на целочисленный тип данных n.

int m,*n;
*n=2;
printf("%d",*n);

Код выше работает нормально.Но

int *n,m;
*n=2;
printf("%d",*n);

дает ошибку сегментации.

объясните, пожалуйста, почему?

Ответы [ 5 ]

7 голосов
/ 15 июня 2011

Обе версии неверны - вам просто повезло с той, которая сработала. Вы объявили указатель, но не выделили для него хранилище. Попробуйте это:

int *n,m;
n=&m;
*n=2;
printf("%d",*n);

Или используя malloc():

int *n;
n=malloc(sizeof(int));
*n=2;
printf("%d",*n);
free(n);
4 голосов
/ 15 июня 2011

Оба сегмента кода вызывают неопределенное поведение , потому что вы разыменовываете неинициализированный указатель.Когда появляется UB, носовые демоны вылетают из носа ... или ваша программа заказывает пиццу, или она падает, или она работает ... Сначала вы должны выделить память.

int* n = malloc(sizeof(int));
*n = 2;
free(n);

Или установить его по адресу другого объекта ;;

int *n, m;
n = &m;
*n = 2;
1 голос
/ 15 июня 2011

Когда вы объявляете переменную-указатель, она выделяет некоторый блок пространства в памяти. Это пространство уже содержит некоторые данные, оставшиеся от того, для чего они использовались до этой программы. Это дает ошибку сегментации, потому что все данные в указателе относятся к области памяти вне вашего пространства на жестком диске. Как сказал Армен, вы должны инициализировать указатель, указав, куда указывать. Это заменит данные, находящиеся в данный момент в указателе, адресом вашей переменной m (или там, где вы хотите, чтобы он указывал).

0 голосов
/ 15 июня 2011

Вам повезло, что первый работает вообще.Они оба обращаются к неинициализированному указателю.

На что указывает «n»?Поскольку он неинициализирован, он ни на что не указывает.В каждом случае вы присваиваете любое значение n, указывающее на значение 2. Первое в конечном итоге приведет к неприятной ошибке.Вам повезло со вторым, потому что он сразу разбился.

Используйте malloc, чтобы создать память для n, на которую можно указать, а затем назначьте ее.

0 голосов
/ 15 июня 2011

n - неинициализированный указатель. Доступ к нему вызывает ошибку.

...