关于结构体字节对齐和字符指针输出地址时遇到的问题

#include<iostream>
using namespace std;
struct A
{
	//偏移量是1的倍数
	char a;//偏移量为0
	char v;//偏移量为1
	char t;//偏移量为2
	char i;//偏移量为3
	char o;//偏移量为4
	//由于o后面可用的偏移量为5,不是sizeof(int)的整数倍,所以应该偏移至8
	//偏移量为4的倍数
	int b;//偏移量为8
	int m;//偏移量为12
	int n;//偏移量为16
	//偏移量为2的倍数
	short p;//偏移量为20
	short c;//偏移量为22
	//偏移量是8的倍数
	double j;//偏移量为24
	//偏移量为2的倍数
	short l;//偏移量为32
	//偏移量为1的倍数
	char z;//由于l后面可用的偏移量为34,不是结构体A的最宽基本类型大小8的整数倍,所以应该偏移至40
	//所以此结构体的字节数为40
	
}x;
int main()
{
	cout << "结构体A的字节数为:"<<sizeof(struct A) << endl;
	cout << "结构体x的首地址为:"<<&x << endl;
/*cout操作字符指针的话,它遇到地址,就会直接去寻找这个地址所指向的内容,
并把它的空间里的机器数按照字符的规则转化成字符输出,直到遇到“/0”这个操作符才停止。
所以我们直接输出&x.a的时候,它先输出‘A’然后再继续读取后面的内存空间直到遇到“/0”,显示结果是“字符+乱码”。
当然,因为此题是结构体,为自定义类型,默认结构体成员变量初始化为0,所以第一个字符即为终止符,就没有了后续的乱码。
但是依旧没有按照想象的输出x.a的地址。
解决办法:
1. 可以用printf代替cout输出
	printf("&x.a : %p\n", &x.a);
2. 将&a强制转换成(void *)&x.a



*/
	printf("&x.a = %p\n", &x.a);
	cout << "&x.v = " << (void*)&x.v << endl;
	cout << "&x.t = " << (void*)&x.t << endl;
	cout << "&x.i = " << (void*)&x.i << endl;
	cout << "&x.o = " << (void*)&x.o << endl;
	cout << "&x.b = " << &x.b << endl;
	cout << "&x.m = " << &x.m << endl;
	cout<<"&x.n = " << &x.n << endl;
	cout << "&x.p = " << &x.p << endl;
	cout << "&x.c = " << &x.c << endl;
	cout << "&x.j = " << &x.j << endl;
	cout << "&x.l = " << &x.l << endl;
	cout << "&x.z = " << (void*)&x.z << endl;
	return 0;
}

参考博客:
https://blog.csdn.net/firmthinking/article/details/80830714
https://blog.csdn.net/timzc/article/details/6191462
https://blog.csdn.net/pianzhizhixing/article/details/87359125

猜你喜欢

转载自blog.csdn.net/qq_44713855/article/details/102749348
今日推荐