簡體   English   中英

Char指針與NULL的比較

[英]Comparison of a Char Pointer to NULL

我在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,並且不會寫'壞代碼',但我真的想知道這里發生了什么。 有人可以澄清一下嗎?

非常感謝,Aditya

緩沖區不是指針,它不能為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. func ,您嘗試修改ad的價值, 而不是 ad指向的價值。 這不起作用,因為參數值的更改不會反映在調用者中。 您需要將該代碼更改為

    \nint func(char **ad, int a) { *ad = NULL; printf("Integer is %d\\n", a); return 0; }\nint func(char **ad, int a) { *ad = NULL; printf("Integer is %d\\n", a); return 0; } 
    不幸的是,這不適用於其余的代碼,因為......

  2. buffer被聲明為數組對象,而不是指針,你不能修改數組對象; IOW,無法分配buffer 更不用說&buffer的類型是char (*)[20] ,而不是char **

這是你的源代碼的修改版本將“正常工作”,雖然我不確定你要完成的是什么:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM