Char指针与NULL的比较

Adi*_*ya 2 c comparison null pointers

我在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);
}
Run Code Online (Sandbox Code Playgroud)

问题是比较buffer != NULL失败并且控制进入循环内部,这不应该理想地发生.我通过这样做解决了这个问题:

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

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

非常感谢,Aditya

Eri*_*rik 6

缓冲区不是指针,它不能为NULL.

func缓冲区复制地址设置为NULL.这根本不会影响缓冲区.

编辑:扩展说明

char buffer[20];
Run Code Online (Sandbox Code Playgroud)

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

int temp = func(buffer,i);
Run Code Online (Sandbox Code Playgroud)

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

int func( char *ad,int a)
{

ad = NULL;
Run Code Online (Sandbox Code Playgroud)

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