gpt4 book ai didi

字符指针与 NULL 的比较

转载 作者:行者123 更新时间:2023-12-04 11:18:40 25 4
gpt4 key购买 nike

我在 SUSE Linux 上运行我的代码。我有一个指针,我在函数中使它 = NULL。但是当我尝试在 while 循环中将同一个指针与 NULL 进行比较时,问题就出现了。这导致程序崩溃。我在下面的示例代码中重现了我的问题。有人可以告诉我这里发生了什么吗?

我的代码如下:

#include <stdio.h>

int func(char *,int);

int main()
{
char buffer[20];
int i =20;

int temp = func(buffer,i);

if ( (temp == 0) && (buffer != NULL) )
{
printf("inside loop \n");
}
}

int func(char *ad,int a)
{
ad = NULL;
printf("Integer is %d \n", a);
return(0);
}

问题在于比较 buffer != NULL 失败并且控制进入循环内部,这不应该发生在理想情况下。我已经通过这样做解决了这个问题:

ad[0] = NULL 并且比较更改为 buffer[0] != NULL

由于 NULL 仅在指针上下文中使用,因此这是错误的代码。我可以在我的解决方法中使用 '\0' 而不是 NULL,并且不用编写“错误代码”,但我真的很想知道这里发生了什么。有人可以澄清一下吗?

非常感谢,阿迪亚

最佳答案

buffer 不是指针,它不能为 NULL。

您的func 将缓冲区的复制地址 设置为NULL。这根本不会影响缓冲区。

编辑:扩展解释

char buffer[20];

这在堆栈的某处保留了 20 个字节。它们没有以任何方式初始化。由于您有 20 个字节的内存,显然这些字节必须驻留在某个地址。

int temp = func(buffer,i);

这会获取缓冲区中 20 个字节的地址,并将其传递给 func。

int func( char *ad,int a)
{

ad = NULL;

在这里,在堆栈的一个新位置,一个新的指针变量将仅在 func 执行时存在。这个指针变量一个地址,指向一个地址。您更改此指针,这会影响它指向的位置。但它不会以任何方式改变你的原始缓冲区,因为 ad 只是堆栈上的一个临时变量,它包含你的 buffer 变量中的字节地址(直到你设置此临时变量为 NULL)。

关于字符指针与 NULL 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5042987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com