为什么argv的类型是char *[]而非string[]?
关于
argv设计为char指针数组的核心逻辑 - 优先解决变长参数的内存开销问题
C语言设计早期硬件内存资源极其有限,而程序的入参个数、每个参数字符串的长度均无固定标准:如果采用二维char数组存储参数,必须提前预设最大参数个数、单参数最大长度,会产生大量内存冗余。而char*指针数组的方案,每个参数仅占用「实际字符串长度+1」的内存(末尾1字节存储结束符\0),指针数组本身仅需要(参数个数+1)个固定大小的指针空间(末尾的NULL是遍历终止的哨兵位),完全没有冗余开销。比如传入3个长度分别为1、2、3的参数,用指针数组方案总开销不到50字节,而如果用预设10个参数、单参数最大256字节的二维数组,就要占用2560字节,开销差了50倍以上,在早期内存仅几十KB的设备上差异尤其明显。 - 贴合C语言的原生字符串语义
C语言没有原生字符串类型,字符串的本质就是以\0结尾的char数组,数组在传值时会自动退化为首元素指针,用char*指向每个参数字符串是最轻量化的实现方式,不需要额外的封装层,访问、遍历参数的逻辑也最简洁,直接通过下标argv[n]就能拿到第n个参数的首地址。 - 你对指针的使用场景认知存在偏差:指针并非只有修改指向时才有使用价值
指针最核心的作用是引用内存地址,不管指向的内存是可读可写还是只读,用指针来引用变长、不定长的内存块都是C语言里最基础、开销最低的实现方式。程序入参虽然通常是只读的,但用指针指向不同长度的参数字符串,远比定长数组的方案灵活得多。 - 历史兼容性约束
这个设计从最早的UNIX C实现就已落地,后来被纳入C标准,成为了所有类UNIX系统、兼容C的运行时的通用约定,后续的语言、系统设计也都会兼容这个约定,避免破坏既有生态的兼容性。
内容的提问来源于stack exchange,提问作者user8087992
相关产品推荐
相关产品推荐

