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