我该如何测试这个C函数

时间:2013-07-18 15:39:27

标签: c pointers

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

  

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

我认为我写的功能是对的(如果不是,请更正),但我该如何测试呢?

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

我试过了:

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

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

5 个答案:

答案 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

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