5

我有一个奇怪的问题要做作为练习:

编写一个函数,将指针指针指针指针指针指针指针指针指针指针指针指针作为参数并为其赋值。

我认为我写的函数是正确的(如果不是,请纠正)但是我该如何测试它呢?

void function(int *********anInt)
{
    *********anInt = 5;
}

我试过了 :

int main(void) {
    int *********nbr = malloc(sizeof(int));
    function(nbr);
    printf("%d", *********nbr);
}

但是我遇到了一个段错误,我刚刚了解到mallocpointers所以我并不完全理解它。

4

5 回答 5

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;
}
于 2013-07-18T15:42:14.760 回答
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);
}
于 2013-07-18T15:44:25.673 回答
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 程序员和编译器。

于 2013-07-18T15:46:17.713 回答
2

Anint**是一个指向指针的指针:

int myInt;
int* pInt = &myInt;
int** ppInt = &pInt;

Anint***是一个指向指针的指针,该指针指向一个指针:

int*** pppInt = &ppInt;

要测试您的功能,您需要不断地进行正确的次数。

于 2013-07-18T15:42:32.760 回答
1

请参阅 md5 的解决方案,但它缺乏解释

解释:

您的测试程序不起作用的原因是 malloc 返回的 avoid*只是一个内存地址(一个指针)。您将其分配给 anint*****...这意味着当程序尝试取消引用到实际 int 时,它正在执行的操作是首先获取 int 的内存地址并取消引用它(这没关系),但此后因为您的值 (5) 现在是重视它然后解除它,这应该与你的段错误一起回来。

将赋值视为嵌套的取消引用:

int ********p8 = *anInt; // p8 == 5
int *******p7 = *p8; // This breaks since dereferencing memory
                     // address 5 results in a segfault

为了避免这种情况,我们实际上嵌套了指针,当取消引用赋值时,我们有内存地址(指针)来取消引用,最终到达存储值的内存地址。

于 2013-07-18T16:00:04.183 回答