我的意思是询问在调用execve
系列函数时如何保留字符串字面量。来自OSTEP第4章:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main (int argc, char *argv[]) {
...
int rc = fork();
...
if (rc == 0) {
char *myargs[3];
myargs[0] = strdup("wc");
myargs[1] = strdup("p3.c");
myargs[2] = NULL;
execvp(myargs[0], myargs);
}
我将...
表示为与我的问题无关。 我想问的是这里的代码。 据我了解,C设置myargs
以呈现为wc
的主函数的char * argv []
。 我想了解与字符串字面量有关的概念。 据我了解,C标准允许argv
的可变性。 例如:
int main (int argc, char *argv[]) {
argv[0][2] = 'd';
}
然而,我在想当这些字符数组是固定长度时,如何保证这一点。此外,为什么要调用
strdup()
?据我理解,这将堆分配该字符串,使其能够被改变,那么在调用execvp()
时是否必要呢?还是会: myargs[0] = "wc";
可以接受吗?
execvp
将会清除堆,因此不应该有任何影响。这可能是由其他方法保证的(尽管我不能确定)。 - user8393252