Ошибка сегментации, возникающая, когда не определена инициализированная переменная - PullRequest
1 голос
/ 05 августа 2020

Я работаю с указателями в C. Я столкнулся с проблемой при работе с указателями.

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

int main(){
  int x = 1, y = 2, z[10];
  int *ip;  
  
  printf("initial value of x:%d\n",x);
  printf("initial value of y:%d\n",y);
  printf("inital value of ip: %d\n",*ip);
    
  return 0;
}

Эта программа работает правильно. Но в приведенной ниже программе ошибка сегментации возникает, когда не определена инициализированная переменная.

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

int main(){
  int x = 1, y = 2;
  int *ip;  
  
  printf("initial value of x:%d\n",x);
  printf("initial value of y:%d\n",y);
  printf("inital value of ip: %d\n",*ip);
    
  return 0;
}

Почему возникает эта ошибка? Какая связь между ошибкой сегментации и определением переменной?

1 Ответ

1 голос
/ 05 августа 2020

Почему возникает эта ошибка?

Обе программы содержат неопределенное поведение, поэтому ожидается, что обе они не работают.

Проблема в том, что вы разыменовывают неинициализированный указатель:

int *ip; // uninitialized, may contain any value

// ...

printf("...", *ip);
           // ^^^ dereference

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

Что именно происходит, зависит от вашего компилятора, вашей архитектуры, ваша операционная система, флаги оптимизации и другие детали.

Какая связь между ошибкой сегментации и определением переменной?

Нет никакой связи. Определение z заставляет вашу первую программу "казаться работающей" случайно. Как только вы измените что-то еще (например, обновите компилятор до новой версии), он может снова перестать "работать".

...