我编写一个简单的程序,在声明变量之后我正在检查变量的地址但是内存没有连续分配,两者之间存在间隙。 这是我的计划。为什么留下差距我不理解
#include < stdio.h >
#include < stdint.h >
int main()
{
char char_one,char_two;
int a = 5,b = 7,*ptr,*ptr_one;
static int *sum_ptr;
printf("address of a %u\n",&a);
printf("address of variable b %u\n",&b);
printf("address of ptr variable %u\n",&ptr);
printf("address of ptr_one variable %u\n",&ptr_one);
printf("address of char_one var %u\n",&char_one);
printf("address of char_two var %u\n",&char_two);
return 0;
}
输出: 地址2636128020
变量地址b 2636128024
ptr变量的地址2636128000
ptr_one变量的地址2636128008
char_one var 2636128030
的地址char_two var 2636128031的地址
答案 0 :(得分:4)
C标准不需要内存来连续分配变量。事实上,如果编译器决定通过在寄存器中保留一个值来优化内存,则根本不会分配内存。
如果声明了一个struct,那么struct的内容将按照你声明的方式排序,但你仍然可能需要考虑数据在struct中的对齐方式 - 例如,int在4字节边界上对齐在许多架构中。所以如果你有:
struct foo
{
char a;
int b;
}
a保证在内存中位于b之前,但它们仍将在它们之间填充额外的字节以保持正确的对齐(因此它需要8个字节来存储结构,即使它只是“真的”需要5)
这是结构对齐如何工作的好资源:
答案 1 :(得分:3)
编译器不必连续分配内存(不包括数组,如果结构可能在那里填充)。可以从找到空闲位置的位置自由分配内存。
答案 2 :(得分:1)
这是设计和有目的的,即使在刚刚启动的机器上,你也不会得到连续的malloc()。 请在此处阅读:http://en.wikipedia.org/wiki/Address_space_layout_randomization
根据要求:地址空间布局随机化是一种技术,可确保以或多或少不可预测的方式分配内存,以确保依赖于固定地址布局的攻击不会成功。这使得攻击者(更难)利用已知缺陷(甚至首先检测它们)(
)