这可能是因为我是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]
。
答案 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
数组的大小合适。如果在数组声明期间没有给出大小,则编译器仅为提供的初始化程序分配足够的空间,并且以后不可能更改大小。