不是结构体也会存在内存对齐吗?

菜鸟程旭员 2014-03-12 01:19:29
为什么a第二次输出是0?

#include <cstdio>
#pragma pack(1)
using namespace std;

int main()
{

char b='A';
int a=8;
int c=7;
printf("a=%d,b=%c,c=%d\n", a,b,c);
scanf("%s%d",&b,&c);
printf("a=%d,b=%c,c=%d\n", a,b,c);
return 0;
}

但是把b放在a,c后面定义,a的值就是对的?
...全文
150 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloword2010 2014-04-13
  • 打赏
  • 举报
回复
看编译器吧。及得ADS如果遇到这样的问题。b是char类型,用str输入会导致越界,结果就是b破坏了函数栈直接死机;
chinazjf 2014-04-10
  • 打赏
  • 举报
回复
scanf("%s%d",&b,&c); --上面这句有问题,b是chr型,你却用%s对应,导致b赋值越界,a被覆盖.你把a和b交换,a就不会被覆盖了.
  • 打赏
  • 举报
回复
我建了一个测试工程,不用调整b的顺序,结果仍然是对的啊
senioryzc 2014-03-12
  • 打赏
  • 举报
回复
首先你要知道为什么要内存对齐,才能一通百通 需要内存对齐是cpu的指令决定的,比如一个int,cpu的load int的指令要求地址低2位为0,也就是4字节对齐 否则的话,比如int位于地址2处,他就必须先load 地址0的值到寄存器啊,在load地址4的值到寄存器b,再把a的高8位和b的低8位组合起来得到需要的值,结果需要3条指令才能干好

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧