c字符串操作传递给execvp(2)

时间:2012-08-10 06:55:41

标签: c arrays string

这可能是因为我是C编程的新手,但如果我正确地回忆起我的讲师那么

第1部分) execvp(2)有2个参数(obv),第一个是命令,第二个是字符串数组,如

char *args[] = {"ls", "-l", "-a", NULL};

我可以解释char *args[]如何使这个字符串数组而不是带有字符的数组(一个C空终止字符串)?

第2部分)

我怎样才能使它能够通过字符串添加到这个数组字符串?我可以吗

int i;
char *args[255];

for(i = 0; i < strlen(lol); i++)
{
    args[i] = //new string being passed in at runtime
}

它会像那样工作吗?假设我正在从stdin中分解输入,我想将参数放入args[i]

2 个答案:

答案 0 :(得分:1)

第1部分)

char *args[] = {"ls", "-l", "-a", NULL};

上面的代码意味着,您正在创建一个char指针数组。

每个char指针都是根据(双引号)“”内的字符串定义分配固定大小的内存,这些字符串在编译时本身(大括号){}内。在这种情况下,你不能修改char指针指向的字符串的大小。你仍然可以修改指向的字符串的内容。

它的相似之处 char [][4]={"ls", "-l", "-a", NULL};

第2部分) 如果不使用malloc或calloc显式分配内存到char指针,则不能这样做。然后使用strncpy将字符串复制到数组中的char指针。

在第1部分中,固定大小的内存在编译时自行分配。在第2部分中,由于根本没有分配任何内存,所以不能这样做。

答案 1 :(得分:1)

此声明char *args[]可以解密为“args是指向char的指针数组”。 这意味着数组的每个条目都指向一个或多个char所在的位置。

当你进行静态初始化声明args时,编译器会为你拥有的初始化器的数量保留空间,每个初始值都有指向char类型的指针(在你的情况下,数组中有4个指针)。 / p>

对于每个初始化字符串,编译器保留空间(通常在只读数据段中)并将单个字符放在那里,其中null是最后一个字符。数组args包含指向此位置的指针。因此,你有一个间接的水平。

args[0] ---- points at memory location where 3 chars are -----> 'l', 's', '\0'

关于2),您可以将args作为指针数组(而不是2D数组)。但是,您应该为空终止的字符序列分配正确的内存位置。但您必须确保args数组的大小合适。如果在数组声明期间没有给出大小,则编译器仅为提供的初始化程序分配足够的空间,并且以后不可能更改大小。