c - 返回指向 C 中 int 指针的指针的函数

标签 c pointers

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

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

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

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

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

    return &p3;
}

最佳答案

最后你的间接层比你需要的多了一层:

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 ***)。如果您发现自己使用了这种类型的变量,这是一个好兆头,表明您需要重新考虑您的设计。

关于c - 返回指向 C 中 int 指针的指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51557482/

相关文章:

c - 打印精度

c - 链表的意外行为

c - 查找指向字符数组的指针的索引

c - C语言中extern buffer[]和extern *buffer有什么区别?

c++ - 指针内联的意思?

c++ - Murmurhash3_x86_128 如何处理大于 15 字节的数据?

c - 交换两个节点链表C

c - 矩阵、指针、C*

c - 在另一个函数中使用在一个函数中创建的数组

C指针指针,和seg fault