gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:34:17 25 4
gpt4 key购买 nike

我不知道如何让我的指针 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;
}

最佳答案

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] = '\0';

..应该是:

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

等等

parseCommand() 中的

args 不指向参数字符串的 char * 数组——它指向 main() 中的 argvthat 指向参数字符串的 char * 数组...所以您需要在使用之前取消引用 args 一次。

关于C动态分配指向主函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32834917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com