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

为何无法获取C++结构体中部分成员变量的内存地址?

结构体中char类型成员地址无法正常输出的原因

问题描述

我定义了如下C++结构体:

struct Silly {
    char a;
    unsigned short b;
    char c;
    double d;
};

创建该结构体的数组后,尝试打印第一个实例各成员的地址,发现a和c的地址行无有效内容,仅b和d的地址正常显示。使用的编译命令为:g++ main.cpp -o main -std=c++23。

原因分析与解决方案

核心问题是打印地址时的格式符与参数类型不匹配,属于未定义行为:

  • C++标准中,使用printf打印指针必须用%p格式符,且对应的参数必须是void*类型。
  • &arr[0].a的类型是char*,如果直接传给%p,部分编译器会因为类型不匹配导致输出异常(比如无内容);而unsigned short*和double*在特定编译器下可能刚好没触发这个问题,但这并不符合标准规范。

正确的打印代码需要将成员地址强制转换为void*:

#include <cstdio>

struct Silly {
    char a;
    unsigned short b;
    char c;
    double d;
};

int main() {
    Silly arr[10];
    printf("&arr[0].a: %p\n", static_cast<void*>(&arr[0].a));
    printf("&arr[0].b: %p\n", static_cast<void*>(&arr[0].b));
    printf("&arr[0].c: %p\n", static_cast<void*>(&arr[0].c));
    printf("&arr[0].d: %p\n", static_cast<void*>(&arr[0].d));
    return 0;
}

额外说明:结构体的内存对齐会在a、c等成员后添加填充字节,但这和地址无法输出无关——填充仅影响成员地址的间隔,不会导致成员本身的地址无法被获取或打印。

内容的提问来源于stack exchange,提问作者user2138149

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:52:04