Вопрос

У меня есть несколько функций, которые обращаются к различным аргументам программы через argv[] множество.Прямо сейчас эти функции вложены внутри main() функция из-за расширения языка, предоставляемого компилятором, позволяющего использовать такие структуры.

Я хотел бы избавиться от вложенных функций, чтобы обеспечить совместимость без зависимости от расширения языка.

Прежде всего я подумал об указателе массива, на который я бы указал. argv[] после запуска программы эта переменная окажется за пределами main() функцию и объявляется перед функциями, чтобы они могли ее использовать.

Поэтому я объявил такой указатель следующим образом:

char *(*name)[];

Это должен быть указатель на массив указателей на символы.Однако, когда я пытаюсь указать на это argv[] Я получаю предупреждение о назначении несовместимого типа указателя:

name = &argv;

В чем может быть проблема?Вы думаете о другом способе доступа к argv[] массив снаружи main() функция?

Это было полезно?

Решение

char ** name;
...
name = argv;

сделаю свое дело :)

Понимаете char *(*name) [] является указателем на массив указателей на char.В то время как аргумент вашей функции argv имеет указатель типа на указатель на char, и, следовательно, &argv имеет указатель типа на указатель на указатель на char.Почему?Потому что когда вы объявляете функцию, принимающую массив, для компилятора это то же самое, что и функция, принимающая указатель.То есть,

void f(char* a[]);
void f(char** a);
void f(char* a[4]);

являются абсолютно идентичными эквивалентными объявлениями.Не то, чтобы массив был указателем, но как аргумент функции он

ХТХ

Другие советы

Это должно сработать,

char **global_argv;


int f(){
 printf("%s\n", global_argv[0]); 
}

int main(int argc, char *argv[]){
  global_argv = argv;
 f(); 
}
#include <stdio.h>

int foo(int pArgc, char **pArgv);

int foo(int pArgc, char **pArgv) {
    int argIdx;

    /* do stuff with pArgv[] elements, e.g. */      
    for (argIdx = 0; argIdx < pArgc; argIdx++)
        fprintf(stderr, "%s\n", pArgv[argIdx]);

    return 0;
}

int main(int argc, char **argv) {
    foo(argc, argv);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top