C 为什么不能在堆栈上分配动态大小的数组?
在C中,我们都了解到:C 为什么不能在堆栈上分配动态大小的数组?,c,arrays,memory,allocation,C,Arrays,Memory,Allocation,在C中,我们都了解到: int i[500]; // Array of 500 integers on stack int *i = malloc(sizeof(int) * 500); // Array of 500 integers on heap 当函数从堆栈中推送和弹出变量时,堆栈大小会增长和收缩。但为什么不能从堆栈中推送和弹出动态大小的数组?是的,它们可以: ISO C99中允许使用可变长度自动阵列,并且作为 扩展GCC接受它们在C90模式和C++中。这些阵列是 与任何其他自动数组
int i[500]; // Array of 500 integers on stack
int *i = malloc(sizeof(int) * 500); // Array of 500 integers on heap
当函数从堆栈中推送和弹出变量时,堆栈大小会增长和收缩。但为什么不能从堆栈中推送和弹出动态大小的数组?是的,它们可以:
ISO C99中允许使用可变长度自动阵列,并且作为
扩展GCC接受它们在C90模式和C++中。这些阵列是
与任何其他自动数组一样声明,但长度为
不是一个常量表达式。存储是在存储点分配的
当包含
声明退出。例如:
简单测试:
$ cat testarray.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
size_t n = atol(argv[1]), i;
printf("array size: %lu\n", n);
int a[n];
for (i=0; i<n; ++i) {
a[i] = i;
}
printf("%d\n", a[0]);
return 0;
}
$ ./a.out 100000
array size: 100000
0
$ ./a.out 1000000
array size: 1000000
0
$ ./a.out 10000000
array size: 10000000
Segmentation fault
$ ./a.out 100000000
array size: 100000000
Segmentation fault
$cat testarray.c
#包括
#包括
int main(int argc,字符**argv){
尺寸n=原子(argv[1]),i;
printf(“数组大小:%lu\n”,n);
int a[n];
对于(i=0;i如果数组的长度自第一次分配后不会改变,则可以在堆栈上进行分配,即使在编译时它的大小未知。C99在变量长度数组的名称下支持这一点。该语言的早期版本可以用非标准的alloca
函数模拟相同的情况
然而,术语“动态调整大小的数组”通常假定数组可以一次又一次地增长,直到内存仍然可用为止,而这样的事情在堆栈上是不可能的,因为数组之后的堆栈空间可能已经被另一个函数调用占用了。他们可以,从1999年开始:)此外,一些系统也提供了这个功能。此外,一些系统有一个在堆栈上动态分配的函数@Danvil,这个讨论如何解决我的问题?请注意,C标准没有指定如何/何时使用堆栈或堆,或者它们是否应该存在(事实上,单词“stack”和“heap”)它讨论静态、自动和分配的存储持续时间,并将内存布局的细节留给实现。char str[strlen(s1)+strlen(s2)+1]
是在堆栈上分配的,而不是在堆上分配的?@BlackMamba:是的,它发生在自动存储上(在大多数体系结构中是堆栈内存)基本上,它是alloca的语法糖。
$ cat testarray.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
size_t n = atol(argv[1]), i;
printf("array size: %lu\n", n);
int a[n];
for (i=0; i<n; ++i) {
a[i] = i;
}
printf("%d\n", a[0]);
return 0;
}
$ ./a.out 100000
array size: 100000
0
$ ./a.out 1000000
array size: 1000000
0
$ ./a.out 10000000
array size: 10000000
Segmentation fault
$ ./a.out 100000000
array size: 100000000
Segmentation fault