C将指针指定为NULL

lyn*_*nks 11 c pointers function

我误解了关于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;
}
Run Code Online (Sandbox Code Playgroud)

哪些产出;

FIRST TEST: ptr is not null
SECOND TEST: ptr is not null
Run Code Online (Sandbox Code Playgroud)

为什么第二个测试仍然看到指针不是NULL?我试图使用NULL指针赋值作为一种'返回标志'来指示函数的某个失败.但是在之后测试指针时,它似乎不是NULL.

Som*_*ude 32

这是因为指针是按值传递的,而不是通过引用传递的.如果要更改函数内部的指针,则需要将实际指针作为指针传递,即指向指针的指针:

void my_function(char **a)
{
    *a = NULL;
}
Run Code Online (Sandbox Code Playgroud)

&调用函数时使用address-of运算符来获取指针的地址:

my_function(&ptr);
Run Code Online (Sandbox Code Playgroud)

  • 在你回答之前,我突然想到这是多么愚蠢,我需要一个指向指针的指针才能分配外部指针! (2认同)

Rüp*_*ure 6

你的声明a=NULLmy_function()确实设置的值aNULL,但a就是功能.当你传递的局部变量ptr,以my_function()main(),价值ptr被复制到a.I假设你的整个混乱从产生*使用之前a的定义my_function().

当我们想要从被调用函数中操纵那些指针所指向的原始值时,指针通常被传递给函数,这是由dereferencing来自被调用函数的那些指针完成的.在这种情况下,你使用过这个:

*a= blah blah;
Run Code Online (Sandbox Code Playgroud)

它会反映在地址指向的值ptrmain().但既然你想改变的价值ptr本身,你需要能够有办法manipulate从它my_function().对于这一点,你使用pointer-to-pointer,即类型char**.您传递这样一个char**参数my_function(()并使用它来改变ptr.Here的值是你的代码的变化,它会为你做的:

#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;
}
Run Code Online (Sandbox Code Playgroud)