c - c语言结构中的内存分配
问题描述
我编写以下代码只是为了验证我用来学习 c 的其中一本书中所写的内容。分配给第一个变量(即字符变量)的内存没有意义。分配的内存是 4 个字节而不是 1。有人可以帮我我哪里出错了吗?
struct book
{
char name;
int price;
int pages;
};
struct book b1={'a',23,45},b2={'d',56,34},b3={'e',38,79};
printf("%p\t %p\t %p\n",&b1,&b2,&b3);
printf("%p\t %p\t %p\n",&b1.name,&b1.price,&b1.pages);
0x7ffd4f9a0384 0x7ffd4f9a0390 0x7ffd4f9a039c
0x7ffd4f9a0384 0x7ffd4f9a0388 0x7ffd4f9a038c
解决方案
您似乎将地址与大小混淆了。printf
语句应该这样写 :
printf("%zu\t %zu\t %zu\n", sizeof(b1), sizeof(b2), sizeof(b3));
printf("%zu\t %zu\t %zu\n", sizeof(b1.name), sizeof(b1.price), sizeof(b1.pages));
这将为您提供以下输出:
12 12 12
1 4 4
至于为什么结构体的大小是 12 字节而只保存 9 字节的数据,这与结构体对齐有关。
推荐阅读
- c++ - 实例成员与静态成员与非类方法的成本
- unreal-engine4 - 在虚幻引擎 4 中实现 4K 纹理的硬件要求
- cassandra - UUID 或 Integer 作为分区键是一个不错的选择吗?
- e-commerce - kentico cms 电子商务电子邮件模板的附件
- android - 使用 InputMethodManager 隐藏后如何带回软键盘
- c# - 将序列中连续出现的特定数字替换为单个出现
- javascript - 单击切换后如何更改按钮值是 angularJs 中切换列表上的单击值?
- ios - iOS 相机 AVCaptureSession 在纵向与横向大小或分辨率
- hibernate - 当数据库中有很多对象时,Spring Boot 无法使用 Hibernate 启动
- c++ - 为什么在设置 SO_RCVTIMEO 时 recv 返回 -1 和 errno=EINTR?