【问题标题】:Pointer pointing to invalid location error in C指向C中无效位置错误的指针
【发布时间】:2013-03-22 12:36:06
【问题描述】:

我正在运行一个函数,但在第 10 行出现错误。在 gdb 上调试时,我看到 ptr 指向 0x0。我假设这指的是关于无效地址位置的东西。为什么会这样,我该如何再次修复代码。谢谢

1  static char *kstrdup(const char *buf)
2  {
3     char *ptr, *ret;
4 
5     ret = ptr = kmalloc(strlen(buf) + 1);
6     if ((ptr = NULL))
7         panic("kmalloc returned NULL");
8 
9     for (; *buf != '\0'; ++ptr, ++buf)
10        *ptr = *buf;
11
12    *ptr = '\0';
13
14    return ret;
15 }

【问题讨论】:

    标签: c pointers gdb initialization memory-address


    【解决方案1】:

    这就是问题所在:

    if ((ptr = NULL))
    

    因为它是一个作业,而不是一个比较。如果将NULL 分配给ptr 并且分配的结果为零,这意味着条件是false 并且没有输入if () 并且没有调用panic()(这可能会退出程序)。剩下的代码然后取消引用 NULL 指针,这是未定义的行为。

    改为:

    if (ptr == NULL) /* or if (!ptr)
    

    一些开发人员更喜欢将const 值放在相等检查的左侧,以便编译器可以帮助检测此错误。例如,如果你写了:

    if (NULL = ptr)
    

    编译器会发出错误(例如左操作数必须是左值)并且编译会失败。

    【讨论】:

    • 或者更好的是,将其更改为if(ptr == NULL)。一些愚蠢的编译器在看到双括号时会抑制警告。如果编译器不是愚蠢的,它会对此代码发出警告。
    • 在条件句中首先使用常量编写代码通常是明智之举...而不是 if( ptr == NULL ) 您可以编写 if( NULL == pointer ) -- 这样做的好处是如果/当您不小心离开第二个'='并将条件转换为赋值时,编译器将阻止尝试将值分配给常量。这是避免代码中出现细微运行时错误的一种简单方法。
    • @KScottPiel,刚刚更新以包含该内容。我经常这样做,但有些开发者不喜欢它。
    • 谢谢!我在这个 bug 上花了 4 个小时,而你只花了不到 5 分钟。你是救生员
    • 经验被定义为当你再次犯错时识别错误的能力......我们花了5分钟,因为我们已经做了一百次了~咧嘴笑~
    【解决方案2】:

    关于分配和比较之间的区别有一个很棒的教程。它太好了,你会下意识地知道什么时候用赋值,什么时候用比较。这是 KN King 在他的巨著 http://www.amazon.com/c/knking"> C 编程:一种现代方法。一定要读一遍。顺便说一句,== 属于 < <= > >= !=

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多