将结构体强制转为char*传入printf输出乱码,原因何在?
问题解析:结构体指针转
char*后printf输出乱码的原因 你混淆了结构体第一个成员的类型:你的结构体str的第一个成员是char *s(一个指针变量),而非char s[](字符数组)。
虽然&s(结构体指针)确实和&s.s(第一个成员的指针)指向同一内存地址,但两者指向的内容完全不同:
&s.s指向的是一个指针变量,这个变量里存储的是字符串"Hello World!"的内存地址;- 当你把
&s强制转换成char*传给printf("%s")时,printf会从结构体的起始地址开始,把内存中的字节当作字符逐个输出,直到遇到\0。但结构体内存里存的是指针的二进制值(比如64位系统下是8个字节的地址数据),这些字节对应的ASCII字符大多是不可打印的乱码,甚至会一直读取到内存中随机的\0才停止,所以最终输出乱码。
正确写法示例
直接传入字符串的指针(即结构体的第一个成员)即可:
#include <stdio.h> #include <string.h> typedef struct str { char *s; } str; int main(void) { str s; s.s = "Hello World!"; // 写法1:直接使用成员变量 printf("%s\n", s.s); // 写法2:通过结构体指针访问第一个成员 printf("%s\n", ((str*)&s)->s); }
补充说明
如果结构体的第一个成员是字符数组,比如:
typedef struct str { char s[20]; } str;
此时将&s强制转换为char*传给printf("%s")就能正常输出——因为结构体的起始地址就是字符数组的起始地址,内存中存储的是字符串的实际内容。
内容的提问来源于stack exchange,提问作者mortytheshorty
相关产品推荐
相关产品推荐

