C指针通过函数指针

时间:2012-01-10 05:25:22

标签: c

只是玩指针,试图将指针的地址传递给函数

使用:

void changer(int **ptr)
{
    if(**ptr==NULL)
    {   
        *ptr=(int *)malloc(sizeof(int));
        **ptr=2;
    }

}

int main()
{
    int *ptr;
    clrscr();
    changer(&ptr);
    printf("%d",*ptr);
    getch();
    return 0;
}

程序严格遵守,结果不符合预期!!

4 个答案:

答案 0 :(得分:4)

您在ptr检查中有NULL的额外解除引用,并且您没有初始化指针。修复后程序应如下所示:

#include <stdio.h>
#include <stdlib.h>

void changer(int **ptr)
{
    if(*ptr==NULL) // Dereference once, not twice
    {
        *ptr=(int *)malloc(sizeof(int));
        **ptr=2;
    }
}

int main()
{
    int *ptr = 0; // Initialize the pointer
    clrscr();
    changer(&ptr);
    printf("%d",*ptr);
    getch();
    return 0;
}

答案 1 :(得分:3)

崩溃是因为你的意思是第3行:

if (*ptr == NULL)

而不是

if (**ptr == NULL)

您还需要在第13行初始化指向NULL的指针,因为您正在使用以上内容对其进行检查:

int *ptr = NULL;

在C中,变量不会自动初始化为零,除非在静态范围内分配,这取决于上下文而产生其他后果。

答案 2 :(得分:2)

您尚未在ptr中初始化main(),但在changer()中检查它指向的内容是否为零。

使用:

#include <stdio.h>
#include <stdlib.h>

void changer(int **ptr)
{
    if (*ptr == NULL)
    {
        *ptr = (int *)malloc(sizeof(int));
        if (*ptr != NULL)
           **ptr = 2;
    }
}

int main(void)
{
    int *ptr = NULL;
    changer(&ptr);
    printf("%d\n", *ptr);
    return 0;
}

答案 3 :(得分:0)

像另一个人说的那样,你有额外的*。

我认为你可以使用这样一个事实,即c中的var声明是由一个类型和一个表达式构成的。

例如,声明int **ptr(如果您的函数),假设表达式**ptr来自int类型,那么在检查**ptr == NULL中,您进行比较int到指针。这是合法的,但当你发现自己正在做这样的事情时,你可能想重新考虑你做了什么。 (一个好的编译器可能会给你一个警告)