从输入参数声明自动变量的数组大小

aks*_*aks 1 c stack

我一直在运行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)

caf*_*caf 5

在C99中将可变长度自动阵列引入C中.

通过数组大小调整堆栈指针来分配数组,就像普通的自动变量一样 - 唯一的区别是堆栈指针调整的大小和a帧指针的偏移量不是可以在编译时计算的常量-time - 必须在运行时计算它们.

类似地,为了sizeof在可变长度数组上正确工作,当它应用于这样的数组时,它也无法在编译时计算.a输入范围时,必须记住分配的大小.

正是这种家政信息-的数量,大小和可变长度自动数组的偏移-即保持在栈上的你之间看到了额外的空间aptr.那里可能还有一个额外保存的帧指针 - 您必须深入挖掘源代码才能找到编译器.

哦,你看到的原因-1sizeof是因为你没有正确地与打印出来%d符-使用%zusize_t.