gpt4 book ai didi

c - 为什么这里使用 strdup() ?

转载 作者:行者123 更新时间:2023-12-04 12:27:32 25 4
gpt4 key购买 nike

我正在阅读“操作系统:三个简单的部分”。在第 5 章中,有一段代码展示了 exec() 系统调用的用法。

    1 #include "common.h"
2
3 int main(int argc, char ** argv) {
4 printf("hello world (pid: %d)\n", (int) getpid());
5 int rc = fork();
6 if (rc < 0) {
7 fprintf(stderr, "fork failed\n");
8 exit(1);
9 } else if (rc == 0) {
10 printf("hello, I am child (pid: %d)\n", (int) getpid());
11 char *myargs[3];
12 myargs[0] = strdup("wc");
13 myargs[1] = strdup("p3.c");
14 myargs[2] = NULL;
15 execvp(myargs[0], myargs); // run work count
16 printf("this shouldn't print out\n");
17 } else {
18 int wc = wait(NULL);
19 printf("hello, I am parent of %d (wc: %d) (pid: %d)\n", rc, wc, (int) getpid());
20 }
21 return 0;
22 }
23
为什么在第 12~14 行使用 strdup() ?
我试图用以下内容替换此部分:
   12         myargs[0] = "wc";                                                                                                                                                                                     
13 myargs[1] = "p3.c";
14 myargs[2] = NULL;
它的工作原理和前一个一样。

最佳答案

代码会根据您的更改进行编译,但它可能会触发未定义的行为。
execvp 需要一个参数 char *const argv[] .不是失踪的 constchar .所以execvp可以自由地写入传递给它的字符串。
String literals in C不可修改:

String literals are not modifiable (and in fact may be placed in read-only memory such as .rodata). If a program attempts to modify the static array formed by a string literal, the behavior is undefined.


所以代码的作者希望安全一点和 strdup s 字符串文字以获得字符串的可修改版本。
请注意,C++ 更严格,gcc 会发出

warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]


为您的代码。
execvp不修改 arg 字符串,那么如果它有一个表达这一点的签名( const char *const argv[] )会更好。

关于c - 为什么这里使用 strdup() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69505245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com