Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么不能在堆栈上分配动态大小的数组?_C_Arrays_Memory_Allocation - Fatal编程技术网

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++中。这些阵列是 与任何其他自动数组

在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