C将指针指定为NULL

时间:2013-04-30 12:00:35

标签: c function pointers

我误解了关于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。

6 个答案:

答案 0 :(得分:31)

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

void my_function(char **a)
{
    *a = NULL;
}

在调用函数获取指针的地址时,使用address-of operator &

my_function(&ptr);

答案 1 :(得分:6)

a=NULL中的my_function()语句确实将a的值设置为NULL,但a是该函数的局部变量。当您通过时ptr中的my_function()main()ptr的值已复制到a。我想您的整个混淆来自之前使用过的* a的定义中my_function()

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

*a= blah blah;

它会反映在ptrmain()指向的地址的值中。但由于您想要更改ptr本身的值,您需要能够可以从manipulate my_function()开始pointer-to-pointer。为此,您使用char**,即char**类型。您将my_function(()作为参数传递给{ {1}}并使用它来更改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;
}

答案 2 :(得分:2)

在C中,像foo(a)这样的函数调用永远不会改变a。

的值

答案 3 :(得分:1)

如果要修改指向的内容,您的函数应该char** a。这是因为指针被复制作为函数的参数,这意味着你在函数之外的任何更改都不会在函数外部看到,因为它修改了一个副本。

如果要更改它并在功能范围之外查看它,则需要添加另一个间接。

答案 4 :(得分:0)

将指针传递给函数时,指针被复制到函数范围中。如果你想做这样的事情,你需要使用指针指针。指针基本上只是一个整数/长

答案 5 :(得分:0)

你的问题是,my_pointer得到的不是写指针“ptr”,而是它的副本“* a”。

您需要将“ptr”的地址传递给您想要的内容。