关于execve系列调用中字符串字面量保留及strdup使用的技术疑问
execve系列调用中字符串字面量相关问题解答
疑问1:C标准允许修改argv,可变性如何保证?
当通过execvp启动新程序时,操作系统会将你传入的argv数组中每个字符串,完整复制到新进程的可写内存区域(通常是栈空间)。新程序main函数接收的char* argv[],指向的是这些复制后的可写字符串副本,而非原进程中的源字符串(不管源字符串是字面量还是堆内存中的)。
所以即便原字符串是固定长度的只读字面量,新程序拿到的argv字符串是独立的可写内存块,长度刚好匹配字符串实际长度加1(用于存储终止符\0),只要修改时不越界,就完全符合C标准对argv可修改的要求。
疑问2:直接用myargs[0] = "wc"代替strdup是否可行?
可行,但要分场景:
- 如果原进程不需要在exec调用前修改参数字符串,直接使用字面量完全没问题。execvp只会读取字面量的内容,再复制到新进程的可写内存中,新程序拿到的依然是可修改的副本。
- 示例中使用strdup,核心原因是为了支持「原进程在exec前修改参数」的场景:字符串字面量存储在只读数据段,直接修改会触发段错误;而strdup在堆上分配了可写内存,你可以安全地修改该字符串内容(比如把
"wc"改成"wcl")后再传给execvp。
内容的提问来源于stack exchange,提问作者user129393192
相关产品推荐
相关产品推荐

