C语言中指针赋值值而非地址的行为及char*指针使用相关疑问
C语言char*字符串指针问题解答
问题1:ptr指向什么内容?
你的猜测是对的,ptr存储的是字符串字面量"Hello"首字符'H'的内存地址。要额外注意的是,C中的字符串字面量默认存储在进程的只读数据段,尝试修改ptr指向的内容会触发未定义行为。
问题2:为什么ptr的表现和普通指针不一致?
ptr本身就是普通的char*类型指针,不存在特殊逻辑,你感知到的“不一致”本质是对C字符串存储规则、printf格式化符要求不熟悉导致的误解。
问题3:printf("%s", *ptr)报错、printf("%s", ptr)正常的原因
printf的%s格式化符明确要求传入指向字符串首字符的char*类型指针,它的内部逻辑是从传入的地址开始,逐字节读取字符直到遇到终止符'\0'为止:
- 写
*ptr时,你实际传入的是ptr指向的首字符的值,也就是'H'对应的ASCII码0x48,printf会把这个整型值当成内存地址去读取,而0x48属于进程的非法访问地址,自然会触发段错误/未定义行为。 - 写
ptr时,传入的就是字符串首字符的合法地址,完全符合%s的参数要求,所以可以正常输出完整的Hello字符串。
问题4:ptr中实际存储的内容是什么?
ptr是指针类型变量,里面存储的就是一个整型的虚拟内存地址值,对应的是字符串字面量"Hello"第一个字符'H'在进程地址空间中的位置。
内容的提问来源于stack exchange,提问作者Mr. CLOWN
相关产品推荐
相关产品推荐

