1

array[size]使用和使用定义在运行时之前定义的长度数组(取决于命令行参数)有什么区别malloc()array[i]导致数据放在堆栈上,malloc()使用堆[见这个stackoverflow]

因此,对于大数据,我可以遇到 stackoverflows,但在新机器上总共 30 chars 和ints 应该没有问题(据此,Windows 上的 Stack 大约为 1MB)。

所以我可能遗漏了一些明显的东西。

据我了解,在 中定义时main(),两者应该相同:

示例 1

int size; // depends on some logic
char array[size];

示例 2

int size; // depends on some logic
array= (char *)malloc(size * sizeof(char));
free(array); // later after use

但是当我在函数内部使用数组并将其作为指针 ( func(char* array)) 或数组 ( funct(char array[])) 传递时,有时 gdb-debugger 会让我知道函数在 #1 中传递了损坏的数据,使用已malloc()修复的问题。

array[i]不是在编译时没有确定就不能用了?这是一些范围问题吗?这个答案有一个评论暗示这样的事情,但我不太明白这是否适用于此。

我正在使用 C99。

4

1 回答 1

0

主要区别在于,以固定大小声明的数组是堆栈分配的(并且对它或其元素的引用仅在其范围内有效),而mallocd 数组是堆分配的。

堆栈分配意味着变量直接存储到内存中。访问此内存通常非常快,因为它的分配是在编译期间完成的。

另一方面,在堆上分配的变量在运行时分配了它们的内存,并且-虽然访问此内存较慢-您唯一的限制是虚拟内存的大小。

看看这里:

https://gribblelab.org/CBootCamp/7_Memory_Stack_vs_Heap.html

于 2020-01-20T08:33:50.930 回答