2013-07-18 31 views
5

我有一个奇怪的问题做一个练习:如何测试这个C函数

写其采取的指针的指针的指针的指针的指针的指针的函数一个int指针指针的指针作为参数并为其赋值。

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

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

我想:

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

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

+11

这是什么样的任务是这样的? –

+1

似乎很愚蠢的权利 - 但 - 但我仍然必须这样做,所以任何帮助,将不胜感激; P – ItsASecret

+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; 
} 
+0

非常感谢你,我会尽快接受! ; P – ItsASecret

2

int**是指向指针的指针:

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

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

int*** pppInt = &ppInt; 

为了测试你的功能,你需要随时随地进行,这是正确的次数。

+0

我得到了它的感谢; P – ItsASecret

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); 
} 
+1

我爱疯狂。 –

+1

第一个不起作用。第二个很漂亮。 :D – md5

+0

@ md5你好,我认为它会很紧凑。删除它,直到我想出一个更好的办法:) –

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程序员和编译器。

+0

哈哈很可笑的问题值得一个荒谬的答案,我猜; P – ItsASecret

+3

我想其中一些在这些声明中'*'应该是'&'s。 – Pixelchemist

+0

'* l0' - 解引用0不是一个好主意 – SomeWittyUsername

1

见MD5的解决方案,但是它缺乏交代

解释:

你的测试程序没有工作的原因是因为的malloc返回void*这简直是一个内存地址(指针)。你将它分配给int*****...,这意味着当程序试图解除引用到实际的int时,它首先获取int的内存地址并取消引用它(这没关系),但之后因为你的值(5)是现在它的价值,然后derefences,这应该回来与你的段错误。分配的

想作为嵌套解除引用:

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

做了什么的分配提领时,我们有内存地址(指针)取消引用,最终得到避免这是我们实际上嵌套指针这样存储该值的内存地址。