通用malloc
man malloc可能会有所帮助。malloc
占用minimum
您需要的内存字节数(即malloc
可以选择为您提供更多)。因此,如果您需要数组10
中的元素,最好像您已经完成的那样char
简单地分配。char* argv[10]
但是,这会为 10 个char*
尚未定义的容器创建一个容器。因此,对于每个char*
,argv[0]...argv[9]
您都可以准确定义其中的内容。例如,如果你想 malloc 一个大小为 200 的字符串 for argv[0]
,你可以使用如下语句(注意,200
可以保存在常量或变量中):
argv[0] = malloc(200 * sizeof(char));
一般来说,sizeof(char) == 1 byte
, 所以这个值可能会尝试获取 200 字节。但是,此时您可以argv[0]
按您需要的任何方式进行修改(即strncpy
、strncat
等)。
现在,如果你不知道你可能有多少参数,你可以动态分配你的容器。因此char* argv[10]
,您可以尝试分配一个char** argv
. 为此,您将执行以下语句:
int SOME_SIZE = 1500 ; // Or some dynamic value read, etc.
char** argv = malloc(SOME_SIZE * sizeof(char*));
通常sizeof(char*) == 4 bytes
在 32 位系统上(典型指针的大小)。现在你可以使用这块内存,argv
,以与之前类似的方式。为了便于思考,malloc
以这种方式使用可以让您执行相对等价的char* argv[WITH_SOME_DYNAMIC_NUMBER]
. 因此,您可以按照我上面描述的类似方式操作这个新容器。
但是请记住,当您使用完由 创建的内存时malloc
,您必须调用free
,否则在程序终止之前它不会被释放。
你的问题
如果我正确理解了您的问题,则您有一个扁平的字符串,您想将其转换为execve
. 我将制定一个简单的示例,试图解释可以做到这一点的众多方法中的一种。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void someMethod()
{
char* argv[10];
char* path = getMyPath();
// Notice - this is a little messy and can/should be encapsulated away in another
// method for ease of use - this is to explicitly show, however, how this can work.
argv[9] = malloc((strlen(path) + strlen("--path=") + 1) * sizeof(char));
strncpy(argv[9], "--path=", strlen("--path="));
argv[9][strlen("--path=")] = '\0'; // NULL-terminate since strncpy doesn't
strncat(argv[9], path, strlen(path));
// Do stuff with array
printf("%s\n", argv[9]);
// Technically, you should never get here if execve succeeds since it will blow this
// entire program away (unless you are fork()'ing first)
free(argv[9]);
}