gcc编译器没有重点分配内存

时间:2014-03-20 14:45:49

标签: c memory gcc memory-management

我编写一个简单的程序,在声明变量之后我正在检查变量的地址但是内存没有连续分配,两者之间存在间隙。 这是我的计划。为什么留下差距我不理解

#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的地址

3 个答案:

答案 0 :(得分:4)

C标准不需要内存来连续分配变量。事实上,如果编译器决定通过在寄存器中保留一个值来优化内存,则根本不会分配内存。

如果声明了一个struct,那么struct的内容将按照你声明的方式排序,但你仍然可能需要考虑数据在struct中的对齐方式 - 例如,int在4字节边界上对齐在许多架构中。所以如果你有:

struct foo
{
    char a;
    int b;
}

a保证在内存中位于b之前,但它们仍将在它们之间填充额外的字节以保持正确的对齐(因此它需要8个字节来存储结构,即使它只是“真的”需要5)

这是结构对齐如何工作的好资源:

The lost art of C structure packing

答案 1 :(得分:3)

编译器不必连续分配内存(不包括数组,如果结构可能在那里填充)。可以从找到空闲位置的位置自由分配内存。

答案 2 :(得分:1)

这是设计和有目的的,即使在刚刚启动的机器上,你也不会得到连续的malloc()。 请在此处阅读:http://en.wikipedia.org/wiki/Address_space_layout_randomization

根据要求:地址空间布局随机化是一种技术,可确保以或多或少不可预测的方式分配内存,以确保依赖于固定地址布局的攻击不会成功。这使得攻击者(更难)利用已知缺陷(甚至首先检测它们)(