Я не могу понять, как заставить мой указатель argv сохранять свою память, которую я динамически выделяю в другой функции, называемой parseCommand. Мне нужно вызвать parseCommand, выделить необходимую память для проанализированных строк, а затем вернуться в main и распечатать строки, на которые указывает мой указатель. Я бы просто попросил parseCommand вернуть указатель, но мне нужно вернуть количество найденных аргументов. Я действительно не очень много работал с указателями c, поэтому они доставляют мне некоторые проблемы. Итак, как мне сделать так, чтобы мой указатель сохранял свою память между функциями?
Главное:
int main()
{
char **argv, str[] = "ls -l -s -r -h file";
int argc;
argc = parseCommand(str, &argv);
int i;
printf("Arguments in argv: \n");
for (i = 0; i < argc; i++) //I want to output the arguments
printf("%s \n", argv[i]); //stored in pointer argv
return 0;
}
Моя функция синтаксического анализа, которая динамически выделяет память для моего указателя, чтобы он мог хранить аргументы в str.
Команда разбора:
int parseCommand(char *str, char ***args)
{
int i = -1, prevPos = 0, argc = 0, argl = 0, argCount = 0;
argCount = getArgCount(str); //Returns 6
args = malloc(sizeof(char*) * (argCount + 1)); /*Allocates memory for args in amount of arguments str holds*/
if (!args){printf("Allocation failed");} /*Checks if there was a problem with memory allocation*/
do
{
i++;
if (str[i] == ' ' || str[i] == '\n' || str[i] == '\0')
{
argl = (i + 1) - prevPos; /*argl holds the length of the argument*/
args[argc] = malloc(sizeof(char) * argl); /*Allocates memory for args in the size of the argument*/
if (!args[argc]){printf("Allocation failed");} /*Checks if there was a problem with memory allocation*/
memcpy(args[argc], str + prevPos, argl); /*Copys the argument of the string into args*/
args[argc][argl - 1] = '\0'; /*Assigns \0 at the end of the string*/
argc++;
prevPos = i + 1;
}
} while (str[i] != '\0');
args[argc] = malloc(sizeof(char)); /*Allocates one last piece of memory for args*/
args[argc][0] = (char *)NULL; /*Sets this new piece of memory to NULL*/
printf("Arguments in args: \n");
for (i = 0; i < argc; i++)
printf("%s \n", args[i]);
return argCount;
}
(*args)
везде, где вы используетеargs
вparseCommand
... - person user253751   schedule 29.09.2015if (!args){printf("Allocation failed");}
Поскольку выделение не удалось, нет абсолютно никаких причин пытаться получить доступ к этому выделению. Если код действительно попытается получить доступ к этому неудачному выделению, он фактически будет обращаться к адресу 0, что при использовании любой ОС приведет к событию сбоя сегмента. т.е. отправьте информацию об ошибке в stderr, затем освободите все предыдущие выделения, затем выйдите - person user3629249   schedule 30.09.2015