C语言多级指针问题:void*转char*打印字符串失效原因咨询
错误原因分析
首先明确核心的类型对应关系:
words是char*类型的数组,数组名退化为指针后类型为char **(指向char*的指针)。执行gp = words时,gp中存储的是words数组的首地址,也就是数组第一个char*元素的存储地址,而非字符串本身的首地址。
你修改后的(char *)gp写法存在本质的类型逻辑错误:
你直接把「存储字符串指针的内存地址」强转成了字符串首地址,相当于让%s格式符去读取存储指针值的内存区域。这块区域存的是字符串地址的二进制数据,不是可打印的ASCII字符,因此会输出乱码,极端情况下会触发内存访问越界报错。
原写法的正确性对比
原代码中*(char **)gp的逻辑是完全符合类型规则的:
- 先把
gp强转为char **类型,明确告知编译器该地址中存储的是一个char*类型的字符串指针 - 对强转后的指针解引用,拿到地址中存储的
char*值,也就是字符串真正的首地址,传递给%s后就能正常输出对应字符串。
辅助理解的内存布局示例:
假设字符串"zero"存储在内存地址0x400600处,words数组的首地址为0x40a010:
gp = words执行后,gp的值为0x40a010- 地址
0x40a010处存储的内容就是0x400600(即"zero"的首地址)- 原写法得到的是
0x400600,输出正常的zero- 错误写法直接把
0x40a010当做字符串首地址,读取到的是0x400600的二进制字节,自然输出异常
内容的提问来源于stack exchange,提问作者Mićo Antonić
相关产品推荐
相关产品推荐

