![](/img/trans.png)
[英]const char **p comparison between pointer and integer if (**p == 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)。
兩個問題:
在func
,您嘗試修改ad
的價值, 而不是 ad
指向的價值。 這不起作用,因為參數值的更改不會反映在調用者中。 您需要將該代碼更改為
\n不幸的是,這不適用於其余的代碼,因為......int 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; }
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.