You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将结构体强制转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:32:38