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()
中,args
是 char ***
,但您将其视为 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
一次。
我不知道如何让我的指针 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()
中,args
是 char ***
,但您将其视为 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
一次。