C语言中字符串字面量在内存中是否连续?实例解析
解引用
a-3得到b指向字符串字符的原因解析 先看你的代码:
char *b = "welcome"; { char *a = "home"; printf("%c", *(a-3)); }
核心原因:编译器对字符串字面量的存储优化
C标准规定字符串字面量属于静态存储期,会被放在只读数据区域(如.rodata段),但并没有强制规定这些字面量的存储顺序和布局——这完全由编译器实现决定。
你遇到的情况,是因为你的在线编译器把"welcome"和"home"这两个字符串字面量连续存储在只读段中,且"welcome"的内存地址刚好在"home"的前面,两者之间没有额外填充字节。
比如假设内存布局是(地址从低到高):
地址: ... | w | e | l | c | o | m | e | \0 | h | o | m | e | \0 | ... 指针: ↑b ↑a
此时a指向'h'的地址,a-3就是'm'的地址('h'往前数3个字节),而'm'正是b指向的"welcome"中的字符,所以解引用后会输出'm'。
重要提醒:这是未定义行为
C标准明确指出,访问指针指向范围之外的内存属于未定义行为——a指向的是"home"的首字符,a-3已经超出了这个字符串字面量的合法访问范围,标准不对这种操作的结果做任何保证。
换个编译器、编译选项或者平台,结果可能完全不同:可能输出乱码、程序崩溃,或者得到其他完全无关的值。你这次得到b中的字符只是特定编译器实现下的巧合,不能依赖这种行为写代码。
内容的提问来源于stack exchange,提问作者halfblood_prince
相关产品推荐
相关产品推荐

