Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何测试这个C函数_C_Pointers - Fatal编程技术网

如何测试这个C函数

如何测试这个C函数,c,pointers,C,Pointers,作为练习,我有一个奇怪的问题要问: 编写一个函数,将指针的指针作为参数,并为其赋值 我认为我编写的函数是正确的(如果不是,请更正),但我如何测试它 void function(int *********anInt) { *********anInt = 5; } 我试过: int main(void) { int *********nbr = malloc(sizeof(int)); function(nbr); printf("%d", *********nb

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

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

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

void function(int *********anInt)
{
    *********anInt = 5;
}
我试过:

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

但是我得到了一个segfault,我刚刚学习了
malloc
指针
,所以我不完全理解它。

当然,你可以测试它,尽管它看起来很奇怪

#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;
}
#包括
空函数(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;
功能(&p8);
printf(“%d\n”,n);
返回0;
}

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

int myInt;
int* pInt = &myInt;
int** ppInt = &pInt;
int*** pppInt = &ppInt;
int***
是指向指向指针的指针:

int myInt;
int* pInt = &myInt;
int** ppInt = &pInt;
int*** pppInt = &ppInt;
要测试您的功能,您需要不断地进行测试,测试次数要正确。

试试看

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

你需要一个荒谬的主程序来完成地狱的任务

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程序员和编译器的折磨测试。

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

解释:

测试程序无法工作的原因是malloc返回一个
void*
,它只是一个内存地址(指针)。您将其分配给一个
int******…
,这意味着当程序试图向下解引用到实际的int时,它所做的是首先获取int的内存地址并解引用它(这是可以的),但在这之后,由于您的值(5)现在是值,因此它会解引用该值,这应该会与您的segfault一起返回

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

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

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

这是什么该死的赋值?似乎很愚蠢,对吧--但我仍然必须这样做,因此任何帮助都将不胜感激;像你的作业这样的问题是为了强调指针是如何工作的,尽管它们是。。。太强调了!您因解除锁定而丢失了安培数(地址)!呜呜!我已经42岁了哈哈,我想这个可笑的问题应该得到一个可笑的答案;我猜其中一些
*
应该是那些声明中的
&
s;初始值设定者的RHS需要的是符号,而不是星星。@md5 Ye,我认为它会很紧凑。删除它,直到我想出一个更好的方法:)
&&&&&&&&&nbr
-您不能获取地址的地址,因为它不是左值