#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的值就是对的?
4 个解决方案
#1
首先你要知道为什么要内存对齐,才能一通百通
需要内存对齐是cpu的指令决定的,比如一个int,cpu的load int的指令要求地址低2位为0,也就是4字节对齐
否则的话,比如int位于地址2处,他就必须先load 地址0的值到寄存器啊,在load地址4的值到寄存器b,再把a的高8位和b的低8位组合起来得到需要的值,结果需要3条指令才能干好
需要内存对齐是cpu的指令决定的,比如一个int,cpu的load int的指令要求地址低2位为0,也就是4字节对齐
否则的话,比如int位于地址2处,他就必须先load 地址0的值到寄存器啊,在load地址4的值到寄存器b,再把a的高8位和b的低8位组合起来得到需要的值,结果需要3条指令才能干好
#2
我建了一个测试工程,不用调整b的顺序,结果仍然是对的啊
#3
scanf("%s%d",&b,&c);
--上面这句有问题,b是chr型,你却用%s对应,导致b赋值越界,a被覆盖.你把a和b交换,a就不会被覆盖了.
--上面这句有问题,b是chr型,你却用%s对应,导致b赋值越界,a被覆盖.你把a和b交换,a就不会被覆盖了.
#4
看编译器吧。及得ADS如果遇到这样的问题。b是char类型,用str输入会导致越界,结果就是b破坏了函数栈直接死机;
#1
首先你要知道为什么要内存对齐,才能一通百通
需要内存对齐是cpu的指令决定的,比如一个int,cpu的load int的指令要求地址低2位为0,也就是4字节对齐
否则的话,比如int位于地址2处,他就必须先load 地址0的值到寄存器啊,在load地址4的值到寄存器b,再把a的高8位和b的低8位组合起来得到需要的值,结果需要3条指令才能干好
需要内存对齐是cpu的指令决定的,比如一个int,cpu的load int的指令要求地址低2位为0,也就是4字节对齐
否则的话,比如int位于地址2处,他就必须先load 地址0的值到寄存器啊,在load地址4的值到寄存器b,再把a的高8位和b的低8位组合起来得到需要的值,结果需要3条指令才能干好
#2
我建了一个测试工程,不用调整b的顺序,结果仍然是对的啊
#3
scanf("%s%d",&b,&c);
--上面这句有问题,b是chr型,你却用%s对应,导致b赋值越界,a被覆盖.你把a和b交换,a就不会被覆盖了.
--上面这句有问题,b是chr型,你却用%s对应,导致b赋值越界,a被覆盖.你把a和b交换,a就不会被覆盖了.
#4
看编译器吧。及得ADS如果遇到这样的问题。b是char类型,用str输入会导致越界,结果就是b破坏了函数栈直接死机;