c - C 中指向无效位置错误的指针

标签 c pointers gdb initialization memory-address

我正在运行一个函数,但在第 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 }

最佳答案

问题是:

if ((ptr = NULL))

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

更改为:

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

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

if (NULL = ptr)

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

关于c - C 中指向无效位置错误的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15570487/

相关文章:

c - C 中的指针、malloc 和 char

c++ - 传递对基类指针的引用

c - 如何将多维数组作为指针传递?

c++ - gdb:如何将共享库的日志文件重定向到 gdb 输出

debugging - 如何让 GDB 在 GLib 断言失败时中断?

c - 访问不同源文件中的结构

c - 计算模 25 的高效(循环明智)算法?

c++ - "Undefined Behavior"真的允许*任何事情*发生吗?

c - 如果我们在 RTOS 设备中使用 gcc 的 msse 和 msse2 选项会好吗

c - 与缓冲区溢出数学的基本混淆