указатель на массив аргументов указателя против локального - PullRequest
0 голосов
/ 30 октября 2018

Я хочу назначить адрес массива указателей указателю на массив указателей. Вот что я сделал ниже для аргумента функции. Это не функционировало правильно, это было разыменование к неправильным значениям. Я сузил проблему до кода ниже. Но я не понимаю проблемы.

#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 голосов
/ 30 октября 2018

Выражение ниже является несовместимым присваиванием.

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*. Поэтому во всех ваших выражениях printf приведите void* следующим образом:

printf("address of arg %p\n", (void*)&arg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...