【发布时间】:2009-09-25 00:41:27
【问题描述】:
我一直在运行 gcc 4.3.3 的 Ubuntu 9.04 系统上使用堆栈,并将 randomize_va_space 内核变量设置为 0(/proc/sys/kernel/randomize_va_space)
如果我在一个函数中声明一个自动变量,该函数是一个数组,其大小由输入决定,那么该数组是如何在堆栈上分配的?
函数看起来像这样 -
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));
}
sizeof 运算符在传递数组 a 时返回预期大小(甚至是 -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
【问题讨论】:
-
这不应该编译。您只能在堆栈上声明常量大小的数组。通常你需要做 char *a = new char[i];
-
我也是这么想的,但是编译运行都很好。
-
我想知道您使用的是什么编译器...:P
-
只要运行 'gcc -S prog.c' 你就会看到。