该函数返回指向C语言中int的指针的指针

时间:2018-07-27 11:59:18

标签: c pointers

我正在尝试学习c语言中的指针,并且一直在尝试针对不同类型的情况编写代码示例,这些情况涉及我在this C book中找到的指针

在“指针构造的示例”中,但我似乎无法弄清楚如何从函数返回指向内部指针的指针或如何在main中取消引用此类指针。

我一直在寻找一个简单的示例,但找不到一个可以清楚地说明我的示例。谁能解释这个概念,以及这些指针如何在函数内部工作?

我从函数返回指向int的指针没有任何问题,并且理解该过程,但是更高的级别给我带来了困难。 我一直在尝试写一些非常基本的示例,但是我无法设法在main中存储此函数返回的内容以及如何取消引用它:

int ***func(int x) {
    int n = x * x;
    int *p1, **p2, ***p3;
    p1 = &n;
    p2 = &p1;
    p3 = &p2;

    return &p3;
}

1 个答案:

答案 0 :(得分:5)

最后,您的间接访问级别超出了所需:

return &p3;

p3的类型为int ***,它与函数的返回值匹配。但是,您返回的是p3类型的int ****地址。这是类型不匹配。您可以通过返回p3来纠正此问题:

return p3;

暂时假设您返回的指针(以及所有中间指针)都是有效的,则可以将函数的返回值分配给类型为int ***的变量。然后,您必须取消引用3次才能获得实际的整数值:

int ***rval = func(2);
printf("value=%d\n", ***rval);

这里有一个更大的问题,那就是您返回有效的指针。您要返回的指针值包含一个局部变量的地址(即p2的地址)。当函数返回时,该变量超出范围,因此其地址无效。尝试取消引用超出范围变量的指针是undefined behavior

为使函数返回后要指向的内存有效,您需要使用malloc动态分配内存。

而且,实际上需要三重指针(即int ***)非常罕见。如果您发现自己使用了这种类型的变量,则表明您需要重新考虑设计。