вернуть массив указателей, возвращаемый тип? - PullRequest
2 голосов
/ 20 июня 2011

У меня есть функция ..

char ** getCommand()
{ 
    char *commandArray[BUFSIZ]; //declaring an array of char pointers
    // i m doing things to array

    return commandArray;
}

Я получаю сообщение об ошибке "конфликтующие типы".какой тип commandArray?Это указатель на указатель, верно?

Я пробовал char * getcommand () ..., который тоже не работает.Я вызываю эту функцию в основном, поэтому я delcared ..

main()
{
    char *commands;

    commands = getCommand();  //this didn't work 

    // So I redeclared...
    char *commands[BUFSIZ];

    commands = getCommand();  //this didn't work either.
}

Что происходит?Я никогда не работал с массивом указателей раньше ... кто-то упростил проблему ... и дал мне какую-то подсказку, пожалуйста.спасибо за предложения ... не сработало ...

Я вставляю код ... предложенные изменения отражены ... получаю ту же ошибку, говоря, что getCommand имеет конфликтующие типы ошибок.*

Ответы [ 5 ]

7 голосов
/ 20 июня 2011

У вас есть проблема там.Вы объявляете массив как локальную переменную.
Это означает, что он умрет (будет освобожден) в конце блока.
Если вы хотите вернуть его, вам нужно динамически распределить его (и не забывать освободить).это позже)

char** getCommand()
{ 
    char **commandArray = (char **)malloc(BUFSIZ* sizeof(char*));

    // i m doing things to array

    return commandArray;

}
2 голосов
/ 20 июня 2011

С

char **cmdArray

у вас есть указатель на указатели. Но указатель не имеет допустимого значения. Используйте malloc, чтобы зарезервировать место для нескольких указателей и присвоить это значение указателю

cmdArray = malloc(20 * sizeof (char*));

Теперь cmdArray указывает на область из 20 указателей. Но ни один из этих 20 указателей не имеет действительного значения. Вам нужно выделить место для каждого из этих 20 указателей

for (k = 0; k < 20; k++) {
    cmdArray[k] = malloc(BUFSIZ);
}

Теперь вы готовы идти:)
cmdArray указывает на 20 действительных указателей, и каждый из этих указателей указывает на область памяти, способную содержать символы BUFSIZ (или строки длиной до BUFSIZ - 1).

Чтобы освободить место, вам нужно сделать наоборот: сначала 20 указателей, а затем указатель на указатели

for (k = 0; k < 20; k++) {
    free(cmdArray[k]);
}
free(cmdArray);

Не забудьте проверить возвращаемое значение malloc перед использованием памяти для реального

2 голосов
/ 20 июня 2011

Ниже приведены 2 необходимых изменения:

  • Не должен возвращать ссылку на локальную переменную (которая хранится в стеке функций), вместо этого выделять память из кучи и возвращать ее ссылку.

  • Получающий указатель в main также должен иметь тип char **


char **getCommand(){
     char **command = (char **) malloc(N*BUFSIZE);
     //Do something to command array
     return command;
}

int main(){
     char **commands;
     commands = getCommand();
}
2 голосов
/ 20 июня 2011

Проблема в том, что commandArray - это массив указателей, который хранится в стековом фрейме getCommand (), так что это, с технической точки зрения, неопределенное поведение.Решение состоит в том, чтобы изменить commandArray на char ** и использовать malloc () для выделения всего массива.

1 голос
/ 20 июня 2011

Динамическое выделение commandArray, как предлагают другие, недостаточно, поскольку возвращаемый выделенный массив содержит указатели на входной массив, а входной массив также находится в стеке, поэтому он выходит из области видимости, когда функция getCommand () возвращает.

Чтобы узнать, является ли это проблемой, измените:

char input[BUFSIZ];

На

static char input[BUFSIZ]; 
...