1

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

2 回答 2

4

这就是问题:

if ((ptr = NULL))

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

改成:

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

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

if (NULL = ptr)

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

于 2013-03-22T12:37:15.070 回答
0

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

于 2013-03-22T13:04:13.543 回答