C动态分配指向主函数的指针

C dynamic allocated pointer to main function

我不知道如何让我的指针 argv 维护我在另一个名为 parseCommand 的函数中动态分配的内存。我需要调用 parseCommand,为解析的字符串分配所需的内存,然后 return 到 main 并打印我的指针指向的字符串。我只需要 parseCommand return 指针,但我必须 return 找到的参数数量。我并没有真正使用 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] == '[=11=]')
        {
            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] = '[=11=]';                             /*Assigns [=11=] at the end of the string*/

            argc++;
            prevPos = i + 1;
        }
    } while (str[i] != '[=11=]');

    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;
}

parseCommand() 中,argschar ***,但您将其视为 char **。您需要取消引用一次才能获得 main() 中的 char **。例如,这个:

args = malloc(sizeof(char*) * (argCount + 1));

..应该是:

*args = malloc(sizeof(char*) * (argCount + 1));

还有这个:

args[argc] = malloc(sizeof(char) * argl);

..应该是:

(*args)[argc] = malloc(sizeof(char) * argl);

和这些行:

memcpy(args[argc], str + prevPos, argl);
args[argc][argl - 1] = '[=14=]';

..应该是:

memcpy((*args)[argc], str + prevPos, argl);
(*args)[argc][argl - 1] = '[=15=]';

等等

parseCommand() 中的

args 不指向参数字符串的 char * 数组——它指向 main() 中的 argv,并且that 指向参数字符串的 char * 数组...因此您需要在使用前取消引用 args 一次。