[英]C Assign Pointer to NULL
我誤解了 C 中指針的一些基本知識,這應該很簡單,但搜索什么也沒帶來。 我不明白以下代碼的行為;
#include <stdlib.h>
#include <stdio.h>
void my_function(char *);
int main(int argc, char *argv[]) {
char *ptr;
ptr = malloc(10);
if(ptr != NULL) printf("FIRST TEST: ptr is not null\n");
else printf("FIRST TEST: ptr is null\n");
my_function(ptr);
if(ptr != NULL) printf("SECOND TEST: ptr is not null\n");
else printf("SECOND TEST: ptr is null\n");
}
void my_function(char *a) {
a = NULL;
}
哪些輸出;
FIRST TEST: ptr is not null
SECOND TEST: ptr is not null
為什么第二個測試仍然看到指針不是 NULL? 我試圖使用 NULL 指針賦值作為一種“返回標志”來指示函數的某個失敗。 但是在之后測試指針時,它似乎不是 NULL。
這是因為指針是按值傳遞的,而不是按引用傳遞的。 如果要更改函數內部的指針,則需要將實際指針作為指針傳遞,即指向指針的指針:
void my_function(char **a)
{
*a = NULL;
}
在調用函數時使用地址運算符&
來獲取指針的地址:
my_function(&ptr);
您的發言a=NULL
在my_function()
確實設置的值a
以NULL
,但a
是功能。當你傳遞的局部變量ptr
,以my_function()
中main()
價值ptr
被復制到a
。我想你的整個困惑源於在my_function()
的定義中a
之前使用的*
。
當我們想要從被調用函數中操作這些指針指向的原始值時,通常會將指針傳遞給函數,這是通過從被調用函數中dereferencing
這些指針來完成的。在這種情況下,您是否使用過這個:
*a= blah blah;
它會反映在main()
ptr
指向的地址處的值中。但是由於您想更改ptr
本身的值,因此您需要能夠從my_function()
manipulate
它。為此您使用pointer-to-pointer
,即char**
類型。您將這樣的char**
作為參數傳遞給my_function(()
並使用它來更改ptr
的值。這是您的代碼的變體,可以做到這一點為你:
#include <stdlib.h>
#include <stdio.h>
void my_function(char **); // Change char* to char**
int main(int argc, char *argv[]) {
char *ptr;
ptr = malloc(10);
if(ptr != NULL) printf("FIRST TEST: ptr is not null\n");
else printf("FIRST TEST: ptr is null\n");
my_function(&ptr); //You pass a char**
if(ptr != NULL) printf("SECOND TEST: ptr is not null\n");
else printf("SECOND TEST: ptr is null\n");
}
void my_function(char **a) { //Change char* to char** here
*a = NULL;
}
在 C 中,像foo(a)
這樣的函數調用永遠不會改變 a 的值。
如果您想修改它指向的內容,您的函數應該采用char** a
。 這是因為指針被復制為函數的參數,這意味着您在內部對其所做的任何更改都不會在函數外部被看到,因為它修改了一個副本。
如果你想改變它並在函數范圍之外看到它,你需要添加另一個間接。
當將指針傳遞給函數時,指針被復制到函數作用域中。 如果你想做這樣的事情,你需要使用指針指針。 指針基本上只是一個整數/長整數
您的問題是, my_pointer
不會寫入指針ptr
,而是寫入其副本*a
。
您需要將ptr
do 的地址傳遞給您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.