我一直在运行gcc 4.3.3的Ubuntu 9.04系统上使用堆栈,并将randomize_va_space内核变量设置为0(/ proc/sys/kernel/randomize_va_space)
如果我在函数中声明一个auto变量,该函数是一个大小由输入决定的数组,那么如何在堆栈上分配数组?
该函数看起来像这样 -
int fun(int i) {
char a[i];
char *ptr;
printf("a - %p ptr - %p\n", a, &ptr);
printf("Difference - %ld\n", ((unsigned long)&ptr - (unsigned long)a);
printf("sizeof(a) - %d\n\n", sizeof(a));
}
Run Code Online (Sandbox Code Playgroud)
传递数组a时,sizeof运算符返回预期的大小(甚至-1),所以我想知道为什么数组在堆栈上占用了这么多空间,其次为什么sizeof()返回-1?
输出看起来像这样 -
a - 0xbffff4c0 ptr - 0xbffff4fc
Difference - 60
sizeof(a) - -1
a - 0xbffff4c0 ptr - 0xbffff4fc
Difference - 60
sizeof(a) - 0
a - 0xbffff4c0 ptr - 0xbffff4fc
Difference - 60
sizeof(a) - 1
a - 0xbffff4b0 ptr - 0xbffff4fc
Difference - 76
sizeof(a) - 2
a - 0xbffff4b0 ptr - 0xbffff4fc
Difference - 76
sizeof(a) - 3
a - 0xbffff4b0 ptr - 0xbffff4fc
Difference - 76
sizeof(a) - 4
Run Code Online (Sandbox Code Playgroud)
在C99中将可变长度自动阵列引入C中.
通过数组大小调整堆栈指针来分配数组,就像普通的自动变量一样 - 唯一的区别是堆栈指针调整的大小和a帧指针的偏移量不是可以在编译时计算的常量-time - 必须在运行时计算它们.
类似地,为了sizeof在可变长度数组上正确工作,当它应用于这样的数组时,它也无法在编译时计算.a输入范围时,必须记住分配的大小.
正是这种家政信息-的数量,大小和可变长度自动数组的偏移-即保持在栈上的你之间看到了额外的空间a和ptr.那里可能还有一个额外保存的帧指针 - 您必须深入挖掘源代码才能找到编译器.
哦,你看到的原因-1从sizeof是因为你没有正确地与打印出来%d符-使用%zu了size_t.