C语言中为何argv[]字符串用==比较失效,仅strcmp可用?
为什么普通字符串用
==能比较,而argv中的字符串不行? 核心:==和strcmp的本质区别
在C语言中,字符串是通过char*(字符指针)表示的,这两个操作符的作用完全不同:
==比较的是指针的内存地址:判断两个指针是否指向同一块内存区域;strcmp比较的是字符串的实际内容:逐字符对比,返回0表示内容完全一致。
普通字符串用==生效的原因:编译器的常量池优化
你代码里的char* tempStr = "string";,这里的"string"属于字符串常量,编译时会被放在程序的代码段中。编译器会做一个叫「字符串常量池」的优化:把所有内容相同的字符串常量合并到同一块内存地址,避免重复存储。
所以tempStr和你直接写的字面量"string",其实指向的是同一块内存,这时候==判断地址相等就会返回真。但这只是编译器的非标准优化,不是C语言的强制要求——换个编译器、关闭优化选项,这个==就可能失效,绝对不能依赖这种写法。
argv的特殊之处:内存存储区域不同
argv数组里的字符串,是程序启动时**操作系统从命令行参数复制到进程的运行时内存(堆或栈)**的,和编译期就固定在代码段的字符串常量(比如你写的"add")完全不在同一个内存区域。
比如你执行./program add 1 2时,argv[1]指向的是运行时内存里存储"add"的地址,而代码里的字面量"add"存在代码段里,两个地址完全不同,所以==比较地址会直接失败,必须用strcmp来对比内容。
总结
- 比较字符串内容,永远用
strcmp(忽略大小写用strcasecmp),这是唯一标准且可靠的方式; ==仅用于判断两个指针是否指向同一块内存,不能用来比较字符串内容;argv的字符串存储在运行时分配的动态内存,和编译期的字符串常量地址不同,因此无法用==匹配。
内容的提问来源于stack exchange,提问作者Satyam S
相关产品推荐
相关产品推荐

