Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指向C中无效位置错误的指针_C_Pointers_Gdb_Initialization_Memory Address - Fatal编程技术网

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

指向C中无效位置错误的指针,c,pointers,gdb,initialization,memory-address,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 retu

我正在运行一个函数,在第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))
因为这是一个任务,而不是一个比较。If将NULL赋值给ptr,赋值结果为零,这意味着条件为false,If未输入且未调用panic,这可能会退出程序。然后,剩下的代码取消对空指针的引用,这是未定义的行为

改为:

if (ptr == NULL) /* or if (!ptr)
一些开发人员更喜欢在等式检查的左侧放置一个const值,这样编译器就可以帮助检测这个错误。例如,如果您写过:

if (NULL = ptr)
编译器可能会发出错误,例如左操作数必须是l值,编译可能会失败。

这就是问题所在:

if ((ptr = NULL))
因为这是一个任务,而不是一个比较。If将NULL赋值给ptr,赋值结果为零,这意味着条件为false,If未输入且未调用panic,这可能会退出程序。然后,剩下的代码取消对空指针的引用,这是未定义的行为

改为:

if (ptr == NULL) /* or if (!ptr)
一些开发人员更喜欢在等式检查的左侧放置一个const值,这样编译器就可以帮助检测这个错误。例如,如果您写过:

if (NULL = ptr)

编译器可能会发出错误,例如左操作数必须是l值,编译可能会失败。

关于赋值和比较之间的区别,有一个很好的教程。它是如此的好,以至于你会下意识地知道什么时候使用赋值,什么时候使用比较。这是由KN King在他的巨著中写的http://www.amazon.com/c/knking>C编程:一种现代的方法。一定要读一次。顺便说一句==属于<>==

关于赋值和比较的区别有一个很好的教程。它是如此的好,以至于你会下意识地知道什么时候使用赋值,什么时候使用比较。这是由KN King在他的巨著中写的http://www.amazon.com/c/knking>C编程:一种现代的方法。一定要读一次。顺便说一句==属于<>==

或者更好的是,将其更改为ifptr==NULL。一些愚蠢的编译器在看到双括号时会隐藏警告。如果编译器不是愚蠢的,它会对此代码发出警告。通常明智的做法是使用常量first-in-conditionals编写代码。。。如果ptr==NULL,则可以编写if-NULL==pointer,而不是if-ptr==NULL——这样做的好处是,如果/当您意外地取消第二个“=”并将条件转换为赋值,编译器将在尝试将值赋值给常量时犹豫不决。这是避免代码中出现细微运行时错误的一种简单方法。@KScottPiel正在更新以包含这些错误。我经常这样做,但有些开发者不喜欢。谢谢!我在这个bug上花了4个小时,而你只花了不到5分钟。“你是救命恩人”体验的定义是当你再次犯错时能够识别错误。。。我们花了5分钟在它上面,因为我们已经做了100次~grin~或者更好,把它改为ifptr==NULL。一些愚蠢的编译器在看到双括号时会隐藏警告。如果编译器不是愚蠢的,它会对此代码发出警告。通常明智的做法是使用常量first-in-conditionals编写代码。。。如果ptr==NULL,则可以编写if-NULL==pointer,而不是if-ptr==NULL——这样做的好处是,如果/当您意外地取消第二个“=”并将条件转换为赋值,编译器将在尝试将值赋值给常量时犹豫不决。这是避免代码中出现细微运行时错误的一种简单方法。@KScottPiel正在更新以包含这些错误。我经常这样做,但有些开发者不喜欢。谢谢!我在这个bug上花了4个小时,而你只花了不到5分钟。“你是救命恩人”体验的定义是当你再次犯错时能够识别错误。。。我们花了5分钟,因为我们已经做了100次了~grin~