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

时间:2022-08-08 10:32:32
为什么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的值就是对的?

4 个解决方案

#1


首先你要知道为什么要内存对齐,才能一通百通
需要内存对齐是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就不会被覆盖了.

#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条指令才能干好

#2


我建了一个测试工程,不用调整b的顺序,结果仍然是对的啊

#3


scanf("%s%d",&b,&c);
--上面这句有问题,b是chr型,你却用%s对应,导致b赋值越界,a被覆盖.你把a和b交换,a就不会被覆盖了.

#4


看编译器吧。及得ADS如果遇到这样的问题。b是char类型,用str输入会导致越界,结果就是b破坏了函数栈直接死机;