0

这可能是因为我是 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].

4

2 回答 2

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 部分中,由于根本没有分配内存,因此不能这样做。

于 2012-08-10T07:29:00.033 回答
1

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

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

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

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

关于 2),您可以这样做,因为args它是指针数组(而不是二维数组)。但是,您应该分配以空字符结尾的字符序列所在的正确内存位置。但是你必须确保你args的数组大小合适。如果在数组声明期间没有给出大小,编译器只会为提供的初始化程序分配足够的空间,以后就无法更改大小。

于 2012-08-10T07:29:31.047 回答