我正在尝试学习 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/