C语言 argv中的字符串文字

dced5bon  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(127)

我的意思是询问在调用execve家族时字符串的保存。来自OSTEP Chp.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";

是否可以接受?

m528fe3b

m528fe3b1#

OSTEP Chp.4
该链接中的章节标记为5,而不是4。
然而,我想知道当这些字符数组是固定长度时,如何保证这一点。
C标准规定程序可以修改argv所指向的字符串的内容。(并且包括)空字符。因此,程序可以修改那些字符。因此,它只保证在程序启动时可以使用字符串中的字节。不能保证它可以使字符串更长或使用空字符以外的任何字节。
为什么要调用strdup()
因为作者不知道或忽略了这样一个事实,即它是没有必要的。
在调用execvp()...时是否需要此功能?
不会,execvp会采取措施确保传递给它的字符串对新程序可用。调用execvp的程序不需要复制。
我的意思是询问在调用execve家族时字符串的保存。

  • string literal* 是一段源代码。它不是结果程序中的字符串。string literal是引号内的字符序列,可以选择前缀u8uUL,如"abc"u8"def"。string literal是源代码中的字符,"abc",包括引号。它不是程序中创建的字符“abc”。当程序被编译时,编译器创建由字符串字面量表示的字符串(在C标准使用的计算模型中)。结果字符串仅仅是一个字符串;与不是来自字符串字面量的字符串相比,它没有什么特别之处,除了C标准不保证它可以被修改。2有些人称结果字符串为字符串字面量,但这是语言的一个稍微草率的使用。

传递给execvp的字符串是否来自字符串文字,或由程序以某种方式构造,或从输入中读取,或具有自动,静态或动态分配的存储持续时间与execvp无关。

相关问题