无法在C中将int赋值给dereferenced int

时间:2012-03-30 00:22:47

标签: c int dereference

我迷路了。我无法将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调试器也会到达该行,然后也会出现seg错误。

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 个答案:

答案 0 :(得分:6)

它会出现段错误,因为您从未初始化default_octave以指向可以存储int的任何内容。

答案 1 :(得分:3)

你有int pointer。右。

这只是意味着你有一个指向某个记忆区域的变量 但是你没有分配/保留那个内存区域。所以它可以指向任何东西。

它肯定会指向你不拥有的内存区域,因此会出现分段错误。

你需要为指针分配内存......

例如:

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

或者您也可以使用:

int   default_octave_val;
int * default_octave = &default_octave_val;

您可以分配内存来存储int(然后获取指向有效内存区域的指针),或者创建指向现有内存区域的指针(在给定示例中为堆栈地址)。

然后您可以取消引用该指针,因为它指向有效的内存区域 如果没有,则会出现分段错误或总线错误,具体取决于您的操作系统。