Char指针与NULL的比较

时间:2011-02-18 15:16:41

标签: c pointers null comparison

我在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,并且不会写'坏代码',但我真的想知道这里发生了什么。有人可以澄清一下吗?

非常感谢, 阿迪亚

2 个答案:

答案 0 :(得分:6)

缓冲区不是指针,它不能为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)

答案 1 :(得分:4)

两个问题:

  1. func中,您试图修改ad的值, ad指向的值。这不起作用,因为参数值的更改不会反映在调用者中。您需要将该代码更改为

    
    int func(char **ad, int a)
    {
      *ad = NULL;
      printf("Integer is %d\n", a);
      return 0;
    }
    
    
    不幸的是,这不适用于其他代码,因为......

  2. buffer被声明为数组对象,而不是指针,您无法修改数组对象; IOW,buffer无法分配给。更不用说&buffer的类型是char (*)[20],而不是char **

  3. 虽然我不确定你要完成的是什么,但这是你工作的源代码的修改版本:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define SIZE 20
    
    int func(char **ad, int a)
    {
      *ad = NULL;                   // WOOPA! WOOPA! MEMORY LEAK!!! MEMORY LEAK!!!
      printf("Integer is %d\n", a);
      return 0;
    }
    
    int main(void)
    {
      char *buffer = malloc(sizeof *buffer * SIZE);
      int i = 20;
      int temp = func(&buffer, i);
      if (temp == 0 && buffer != NULL)
        printf("Inside loop\n");
      return 0;
    }