指向C语言中无效位置错误的指针



我正在运行一个函数,我在第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编程:一种现代方法。一定要读一遍。顺便说一句,==属于< <= > >= !=

最新更新