C语言中向函数传字符串的底层机制及两种printf写法差异解析
C语言中传递字符串给函数的底层逻辑及两种写法的差异
传递字符串时的底层行为
向函数传递字符串(不管是直接写字面量还是传指针),本质都是传递字符串在内存中的起始地址。C语言没有原生字符串类型,所有字符串都是以\0结尾的字符数组,函数接收的char*参数,就是这个数组的首地址。
字符串字面量的编译处理
字符串字面量(比如"Hello world\n")会在编译阶段被编译器存入程序的只读数据段(如.rodata),是不可修改的字符数组。不管是直接把它传给函数,还是先赋值给char*变量再传递,本质都是把这个只读段里字符串的首地址传给函数——不存在“转换为字符串字面量”的说法,因为它本身就是字符串字面量。
两种写法的差异
底层执行逻辑
两种写法几乎没有差异:最终都是将同一个只读字符串的首地址传递给printf,执行时printf都会从该地址开始读取字符,直到遇到\0为止。
代码安全性与规范
printf("Hello world\n");是标准且安全的写法:格式化字符串明确可控,不会出现指针异常或意外的格式化占位符问题。printf(c);不推荐的原因:- 如果
c被意外修改成空指针、野指针,或指向的内容被篡改(字符串字面量在只读段,修改会触发未定义行为),会直接导致printf执行出错。 - 若
c指向的字符串包含%这类格式化占位符,但没有传入对应参数,会引发未定义行为,可能导致程序崩溃或安全漏洞。
- 如果
内容的提问来源于stack exchange,提问作者adsf
相关产品推荐
相关产品推荐

