Ошибка сегментации при использовании указателя для перебора массива - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть следующий код, который я использую для перебора массива, который я создал. Тем не менее, одна строка в настоящее время дает мне ошибку сегментации.

#include <stdio.h>

int main(){

  int practice[] = {7, 2, 3, 3, 5};
  int *ip;
  int i = 0;

  *ip = practice[0]; //this is the line giving me problems

  for(; i < 5; ++i){
    printf("%d ", *ip);
    ++ip;
  }

  printf("\n\n");

  return 0;
}

Я замечаю, когда меняю строку: *ip = practice[0] на ip = &(practice[0]) код неожиданно работает. Я не уверен, почему это происходит, поскольку первая строка кажется такой же логичной, как и вторая.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

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

Прежде чем разыменовать указатель, вы должны сначала присвоить действительный адрес.

int *ip; 
ip = practice;
0 голосов
/ 07 сентября 2018

Что здесь происходит:

* ip = практика [0];

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

Квадратные скобки являются способом доступа к фактическим данным на языке C, а не ссылкой на них.

Теперь, когда вы использовали знак &, который используется для получения адреса памяти этих данных, это присвоило адрес этих данных вашей переменной, чего они точно ожидают.

Если вы хотите перебирать массив, используя указатель вместо цикла, вы можете сделать это:

ip = practice;

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

...