Неожиданное поведение и ошибка компилятора при использовании указателей - PullRequest
1 голос
/ 17 октября 2019

Я новичок в C, и в течение нескольких месяцев я использовал указатели и пытался выяснить, как они работают, и изучил синтаксис их использования, но я столкнулся с запутанной частью, когда компилятор выдает ошибку [1] 1473 segmentation fault (core dumped) ./a.outно я думаю, что синтаксис кода правильный.

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

#include <stdio.h>

int main ()
{
  int *b;
  printf ("Enter some int value -> ");
  scanf ("%d", b);

  printf ("Entered value is: %d", *b);


  return 0;
}

Я объявляю переменную, которая является указателем на целое число в памяти. Поскольку его указатель в аргументе scanf () является просто именем этой переменной, и когда я печатаю его в stdout (printf ()), я использую * b, так как указатель на указатель является фактическим значением этой переменной.

1 Ответ

3 голосов
/ 17 октября 2019

*b никуда не указывает. Попробуйте это:

#include <stdio.h>
#include <stdlib.h>
int main ()
{
  int *b = malloc(sizeof(int)); // dynamically allocate memory
  printf ("Enter some int value -> ");
  scanf ("%d", b);

  printf ("Entered value is: %d", *b);
  free(b); // free the dynamically allocated memory
  return 0;
}

Или без динамического выделения памяти, указав вместо этого переменную в стеке:

#include <stdio.h>
int main ()
{
  int a;
  int *b = &a;
  printf ("Enter some int value -> ");
  scanf ("%d", b);

  printf ("Entered value is: %d", *b); // or have a instead of *b
  return 0;
}

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

...