【问题标题】:gcc compiler is not allocating memory contigouslygcc 编译器没有连续分配内存
【发布时间】:2014-04-27 12:09:54
【问题描述】:

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

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

【问题讨论】:

  • 那又怎样? GCC 可以做任何他“想要”的事情
  • 你为什么在乎?您要解决的实际问题是什么?如果您真的想按特定顺序排列它们,请将它们放在一个结构中——然后它们将保持有序。
  • 为什么你认为在这种情况下应该这样做?
  • 我观察到的大多数情况是连续分配的,这就是为什么我认为它会在连续位置分配内存。感谢您澄清我的疑问。
  • 随机分配内存后,中间的内存是否可用?

标签: c memory gcc memory-management


【解决方案1】:

C 标准不需要连续分配变量的内存。事实上,如果编译器决定可以通过将值保存在寄存器中来进行优化,甚至可能根本不分配内存。

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

struct foo
{
    char a;
    int b;
}

a 保证在内存中出现在 b 之前,但它们之间仍会被额外的字节填充以保持正确的对齐方式(因此存储结构需要 8 个字节,即使它只“真正”需要 5 个字节) .

这里有一个很好的资源来了解结构对齐的工作原理:

The lost art of C structure packing

【讨论】:

  • 结构的内容不一定是连续的。例如。 struct bar { char a; float b;} 在 a 和 b 之间有填充。
  • @JeffLoughlin:如果有间隙,它们就不是连续的。该标准确实保证它们按照声明的顺序进行分配。
  • 我看到了误解的根源,并相应地编辑了我的答案 - 我对“连续”的使用仅对“连续”的某些定义是正确的。
【解决方案2】:

这是有意设计的,即使在新启动的机器上,您也不会得到连续的 malloc()。 在这里阅读:http://en.wikipedia.org/wiki/Address_space_layout_randomization

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

【讨论】:

  • 不鼓励仅链接的答案,因为当链接断开时它们会失去价值。请在您的答案中添加更多信息。
  • 对此感到抱歉。我真的没想到这适用于维基百科链接。我会解决的。
【解决方案3】:

编译器没有必要连续分配内存(不包括数组,如果结构可能在那里填充)。从它找到空闲位置的地方分配内存是免费的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多