【问题标题】:Cannot assign int to dereferenced int in C无法在 C 中将 int 分配给取消引用的 int
【发布时间】:2012-03-30 00:22:47
【问题描述】:

我迷路了。我无法将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)

我不知道我能做些什么来解决这个问题。

【问题讨论】:

    标签: c int dereference


    【解决方案1】:

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

    【讨论】:

    • 例如可以分配另一个int对象的地址default_octave = &another_octave,也可以自己为其分配内存,例如default_octave = malloc(sizeof(int));(以后必须用free(default_octave); 释放它,并且只为一个int 分配内存并不是那么有用)。
    • @OliCharlesworth:我投了反对票,但后来被删除了。我看到您是 C 专家,这对您来说是一个非常基本的问题。但是,我不认为这个答案对 OP 有用。尽管如此,您在 James McLaughlin 之后很快就正确地发现了问题。
    • @bernie:很公平。我的政策是写最少的帖子来回答这个问题;如果OP不明白,随时欢迎他们发表评论,我会解释。
    • 同意。当一个简短的答案就足够时,泛滥 OP 的信息可以说是没有意义的。感谢您分享您的观点。
    【解决方案2】:

    您有一个int pointer。对。

    这只是意味着您有一个指向某个内存区域的变量。
    但是您尚未分配/保留该内存区域。所以它可以指向任何东西。

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

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

    例如:

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

    或者你也可以使用:

    int   default_octave_val;
    int * default_octave = &default_octave_val;
    

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

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

    【讨论】:

    • 感谢您给我一个指针顿悟。现在关于指针、堆栈和堆的一切都变得有意义了......
    • 当然... :) 但是在这里,没有首选方法...这完全取决于操作要实现的目标...因为指针可以指向任何东西,它可以指向到堆栈地址或堆地址...如果您想取消引用它,它只需要指向一个有效地址...
    • 计票没问题,只要操作员得到他需要的答案... :)
    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 2013-10-15
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 2011-09-03
    • 2018-02-03
    相关资源
    最近更新 更多