指向指针数组的指针参数vs局部

时间:2018-10-30 06:36:25

标签: c arrays pointers arguments

我想将一个指针数组的地址分配给一个指向指针数组的指针。这就是我在下面针对函数的参数所做的事情。它无法正常运行,正在取消引用不正确的值。我将问题缩小到下面的代码。但我不明白问题所在。

#include <stdio.h>

void test( char * arg[]){
    char * local[] = {"break", "the", "silence", NULL};
    char * (*argptr)[];
    char * (*localptr)[];
    argptr = &arg;
    localptr = &local;

    printf("address of arg %p\n", &arg);
    printf("address argptr is pointing to %p\n", argptr);

    printf("address of local %p\n", &local);
    printf("address localptr is pointing to %p\n", localptr);

    printf("arg %p\n", arg);
    printf("argptr is pointing to %p\n", *argptr);

      printf("local %p\n", local);
    printf("localptr is pointing to %p\n", *localptr);

}


int main()
{
    char * somecmd[] = {"words", "like", "violence", NULL};
    test(somecmd);

    return 0;
}

上述代码的输出:

address of arg 0x7ffd0ab3c418                                                                                                    
address argptr is pointing to 0x7ffd0ab3c418                                                                                     
address of local 0x7ffd0ab3c420                                                                                                  
address localptr is pointing to 0x7ffd0ab3c420                                                                                   
arg 0x7ffd0ab3c450                                                                                                               
argptr is pointing to 0x7ffd0ab3c418                                                                                             
local 0x7ffd0ab3c420                                                                                                             
localptr is pointing to 0x7ffd0ab3c420

arg的地址和argptr的值相同。对于local的地址和localptr的值也是如此。但是,arg的值和解引用的argptr的值不同。这就是我所期望的。我期望更像local的值和取消引用的localptr的值,它们是相同的。

为什么解引用的arg和argptr具有不同的值?

1 个答案:

答案 0 :(得分:0)

以下语句是不兼容的赋值。

argptr = &arg;

您会注意到这样的事情,您已经打开了所有警告:

 error: assignment from incompatible pointer type [-Wincompatible-pointer-types]
     argptr = &arg;

这是因为在语句test(somecmd);中出现的称为参数的数组会衰减为指针,这种情况发生在语句test

因此,在char * (*argptr)[]; 函数中,您必须进行更改

char ***argptr;

address of arg 000000000061FE10
address argptr is pointing to 000000000061FE10
address of local 000000000061FDD0
address localptr is pointing to 000000000061FDD0
arg 000000000061FE30
argptr is pointing to 000000000061FE30
local 000000000061FDD0
localptr is pointing to 000000000061FDD0

然后输出将如预期的那样:

 warning: format '%p' expects argument of type 'void *', but argument 2 has type 'char * (*)[4]' [-Wformat=]

您将找到另一个类似的警告

%p

这是因为会话说明者void*期望有void*。 因此,在您的所有printf语句中,像这样对printf("address of arg %p\n", (void*)&arg); 进行强制转换:

window.open