2

我做了一个测试,我试图将一个数字传递给一个 int 指针,如下所示:

void   mega_pointer(int *********number)
{
    *********number = 1337;
}

但我有一个分段错误。我不明白。有人可以帮助我吗?

编辑:我添加我的主要内容:

int   main(void)
{
   int ********number;

   mega_pointer(&number);
   printf("Result = %d\n", ********number);
   return 0;
}

PS : 对不起你的眼睛,我永远不会在真正的程序中使用 9*,这只是一个实验 ^^

4

5 回答 5

5

重要的问题是如何调用函数;它需要一个 9 间接链才能成功调用。看例子

#include <stdio.h>

void mega_pointer(int *********number)
{
    *********number = 1337;
}

int main() {
    int i = 42;
    int *p1 = &i;
    int **p2 = &p1;
    int ***p3 = &p2;
    int ****p4 = &p3;
    int *****p5 = &p4;
    int ******p6 = &p5;
    int *******p7 = &p6;
    int ********p8 = &p7;
    int *********p9 = &p8;
    mega_pointer(p9);
    printf("%d\n", i);
}

印刷1337

此外,您的程序中存在错误,因为您的代码确实是错误的,并且您将 1337 分配给类型的左值int *(在我的代码中,这将是p1而不是i;但是,如果未启用警告,则不会注意到这一点。如果您编译原始代码gcc -Wall,然后你得到warning: assignment makes pointer from integer without a cast [enabled by default].

于 2013-08-15T10:52:39.300 回答
4

赋值前面的 * 字符没有参数前面那么多。它应该是:

void mega_pointer(int *********number)
{
    *********number = 1337;
}

如果您在程序中有正确数量的人,它应该可以正常工作。你只需要确保你有你指向的有效变量。例如这个程序有效:

#include <stdio.h>

void mega_pointer(int *********number)
{
    printf("%d\n", *********number);
    *********number = 1337;
    printf("%d\n", *********number);
}

int main()
{
    int blah = 1;
    int *blah1 = &blah;
    int **blah2 = &blah1;
    int ***blah3 = &blah2;
    int ****blah4 = &blah3;
    int *****blah5 = &blah4;
    int ******blah6 = &blah5;
    int *******blah7 = &blah6;
    int ********blah8 = &blah7;
    int *********blah9 = &blah8;

    mega_pointer(blah9);

    return 0;
}

它打印:

1
1337

正如预期的那样。

于 2013-08-15T10:42:06.213 回答
1

您的代码有效,但您必须先正确设置指针:

#include <stdio.h>

static void mega_pointer(int *********number)
{
    *********number = 1337;
}

int main(int argc, char **argv) {
    int a = 0;
    int *p1, **p2, ***p3, ****p4, *****p5, ******p6, *******p7, ********p8, *********p9;

    p1 = &a;
    p2 = &p1;
    p3 = &p2;
    p4 = &p3;
    p5 = &p4;
    p6 = &p5;
    p7 = &p6;
    p8 = &p7;
    p9 = &p8;

    mega_pointer(p9);

    printf("a=%d\n", a);
    return 0;
}

运行时:

$ clang -o p ptest.c
$ ./p
a=1337
于 2013-08-15T10:51:32.903 回答
0

分段故障?分段错误是当您尝试访问与其无关的内存或程序可能不存在的内存时发生的事情。

您可以通过以下方式创建此故障:

int *ptr = NULL;
*ptr = 1;

您正在访问的内存目前与该程序无关或可能过去。

于 2013-08-15T10:49:47.803 回答
0

数字 op "*" 符号表示变量的指向数 - 意味着它是指向指针的指针....

您在函数签名中有 9 个“*”,但在函数签名中有“仅”8 个********number = 1337;

如果你愿意

void   mega_pointer(int *********number)
{
    *********number = 1337;
}

它会起作用,但我建议不要使用那么多指向,因为它可能很棘手(正如你发现的那样)并导致麻烦

于 2013-08-15T10:45:43.583 回答