我正在运行一个函数,我在第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 != ' '; ++ptr, ++buf)
10 *ptr = *buf;
11
12 *ptr = ' ';
13
14 return ret;
15 }
这就是问题所在:
if ((ptr = NULL))
作为赋值而不是比较。如果将NULL
赋值给ptr
,赋值的结果为零,这意味着条件是false
,不输入if ()
,不调用panic()
(可能退出程序)。剩下的代码解引用一个NULL
指针,这是一个未定义的行为。
更改为:
if (ptr == NULL) /* or if (!ptr)
一些开发人员更喜欢将可用的const
值放在等式检查的左侧,以便编译器可以帮助检测此错误。例如,如果您写:
if (NULL = ptr)
编译器会发出一个错误(比如左操作数必须是左值),编译失败。
关于赋值和比较的区别有一个很好的教程。它很好,你会下意识地知道什么时候使用分配,什么时候使用比较。它是由KN King在他的伟大著作http://www.amazon.com/c/knking"> C编程:一种现代方法。一定要读一遍。顺便说一句,==
属于< <= > >= !=