作为一个练习,我有一个奇怪的问题:
编写一个函数,该函数将指针的指针指针的指针指针指向int的指针作为参数,并为其赋值。
我认为我写的功能是对的(如果不是,请更正),但我该如何测试呢?
void function(int *********anInt)
{
*********anInt = 5;
}
我试过了:
int main(void) {
int *********nbr = malloc(sizeof(int));
function(nbr);
printf("%d", *********nbr);
}
但我得到了一个段错误,我刚刚了解了malloc
和pointers
,所以我不完全理解它。
答案 0 :(得分:18)
当然,你可以测试它,虽然它看起来很奇怪。
#include <stdio.h>
void function(int *********anInt)
{
*********anInt = 5;
}
int main()
{
int n = 0;
int *p1 = &n;
int **p2 = &p1;
int ***p3 = &p2;
int ****p4 = &p3;
int *****p5 = &p4;
int ******p6 = &p5;
int *******p7 = &p6;
int ********p8 = &p7;
function(&p8);
printf("%d\n", n);
return 0;
}
答案 1 :(得分:7)
尝试
int main() {
int *********nbr;
nbr = malloc(sizeof(int********));
*nbr = malloc(sizeof(int*******));
**nbr = malloc(sizeof(int******));
***nbr = malloc(sizeof(int*****));
****nbr = malloc(sizeof(int****));
*****nbr = malloc(sizeof(int***));
******nbr = malloc(sizeof(int**));
*******nbr = malloc(sizeof(int*));
********nbr = malloc(sizeof(int));
function(nbr);
printf("%d", *********nbr);
}
答案 2 :(得分:5)
你需要一个荒谬的主程序才能完成从地狱的任务!
int main(void)
{
int l0 = 0;
int *l1 = &l0;
int **l2 = &l1;
int ***l3 = &l2;
int ****l4 = &l3;
int *****l5 = &l4;
int ******l6 = &l5;
int *******l7 = &l6;
int ********l8 = &l7;
printf("%d %d %d %d %d %d %d %d %d\n", l0, *l1, **l2, ***l3, ****l4, *****l5,
******l6, *******l7, ********l8);
function(&l8);
printf("%d %d %d %d %d %d %d %d %d\n", l0, *l1, **l2, ***l3, ****l4, *****l5,
******l6, *******l7, ********l8);
return 0;
}
未经测试:也许我没有把事情算作正确,但总的想法是正确的。这是一个酷刑测试 - 对于无辜的C程序员和编译器。
答案 3 :(得分:2)
int**
是一个指向指针的指针:
int myInt;
int* pInt = &myInt;
int** ppInt = &pInt;
int***
是指向指向指针的指针的指针:
int*** pppInt = &ppInt;
要测试您的功能,您需要打开和打开正确的次数。
答案 4 :(得分:1)
参见md5的解决方案,但缺乏解释
<强>解释强>
你的测试程序不起作用的原因是因为malloc返回一个void*
,它只是一个内存地址(一个指针)。你将它分配给int*****...
,这意味着当程序试图取消引用到实际的int时它正在做的是首先获取int的内存地址并取消引用它(这没关系)但是之后你的值( 5)现在是它所反映的值,它应该与你的段错误一起回来。
将赋值视为嵌套解引用:
int ********p8 = *anInt; // p8 == 5
int *******p7 = *p8; // This breaks since dereferencing memory
// address 5 results in a segfault
为避免这种情况所做的是我们实际上嵌套指针,当取消引用赋值时,我们有内存地址(指针)去取消引用,最终到达存储值的内存地址。