Невозможно назначить int для разыменованного int в C - PullRequest
1 голос
/ 30 марта 2012

Я потерян. Я не могу присвоить int разыменованному int *.

  printf("in octave\n");

  int *default_octave;
  printf("attr[%d]: %s\n",i+1,attr[i+1]);

  const char *octave_char = attr[i+1];
  printf("octave_char: %s\n", octave_char);

  int octave_number = atoi(octave_char);
  printf("octave_number: %d\n", octave_number);
  fflush(stdout);

  *default_octave=octave_number;
  printf("in octave pt 2\n");
  fflush(stdout);

Это вывод:

in octave
attr[1]: 4
octave_char: 4
octave_number: 4
Segmentation fault

Почему?

Запустив отладчик GDB, он попадает в эту строку и затем обнаруживает ошибки.

4

0            int octave_number = atoi(octave_char);
(gdb) s
41            printf("octave_number: %d\n", octave_number);
(gdb)
octave_number: 4
42            fflush(stdout);
(gdb)
43            *default_octave=octave_number;
(gdb) print octave_number
$1 = 4
(gdb) s

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a7b in parse_song (song_data=0x7fffffffe7a8, attr=0x602600) at nullaby.c:43
43            *default_octave=octave_number;
(gdb)

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

Ответы [ 2 ]

6 голосов
/ 30 марта 2012

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

3 голосов
/ 30 марта 2012

У вас есть int pointer. Право.

Это просто означает, что у вас есть переменная, указывающая на некоторую область памяти.
Но вы не распределили / зарезервировали эту область памяти. Так что это может указывать на что угодно.

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

Вам нужно выделить память для указателя ...

Например:

 int * default_octave = malloc( sizeof( int ) );

Или вы также можете использовать:

int   default_octave_val;
int * default_octave = &default_octave_val;

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

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

...