Я пытаюсь объявить целочисленную переменную m и указатель на целочисленный тип данных n.
int m,*n; *n=2; printf("%d",*n);
Код выше работает нормально.Но
int *n,m; *n=2; printf("%d",*n);
дает ошибку сегментации.
объясните, пожалуйста, почему?
Обе версии неверны - вам просто повезло с той, которая сработала. Вы объявили указатель, но не выделили для него хранилище. Попробуйте это:
int *n,m; n=&m; *n=2; printf("%d",*n);
Или используя malloc():
malloc()
int *n; n=malloc(sizeof(int)); *n=2; printf("%d",*n); free(n);
Оба сегмента кода вызывают неопределенное поведение , потому что вы разыменовываете неинициализированный указатель.Когда появляется UB, носовые демоны вылетают из носа ... или ваша программа заказывает пиццу, или она падает, или она работает ... Сначала вы должны выделить память.
int* n = malloc(sizeof(int)); *n = 2; free(n);
Или установить его по адресу другого объекта ;;
int *n, m; n = &m; *n = 2;
Когда вы объявляете переменную-указатель, она выделяет некоторый блок пространства в памяти. Это пространство уже содержит некоторые данные, оставшиеся от того, для чего они использовались до этой программы. Это дает ошибку сегментации, потому что все данные в указателе относятся к области памяти вне вашего пространства на жестком диске. Как сказал Армен, вы должны инициализировать указатель, указав, куда указывать. Это заменит данные, находящиеся в данный момент в указателе, адресом вашей переменной m (или там, где вы хотите, чтобы он указывал).
Вам повезло, что первый работает вообще.Они оба обращаются к неинициализированному указателю.
На что указывает «n»?Поскольку он неинициализирован, он ни на что не указывает.В каждом случае вы присваиваете любое значение n, указывающее на значение 2. Первое в конечном итоге приведет к неприятной ошибке.Вам повезло со вторым, потому что он сразу разбился.
Используйте malloc, чтобы создать память для n, на которую можно указать, а затем назначьте ее.
n - неинициализированный указатель. Доступ к нему вызывает ошибку.