簡體   English   中英

C 將指針分配給 NULL

[英]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=NULLmy_function()確實設置的值aNULL ,但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.

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