为何无法获取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
相关产品推荐
相关产品推荐

