我有这样的程序,
计划1
#include <stdio.h>
#include <string.h>
#define ARRAY_SIZE 0x320204
int main ()
{
unsigned long long_array[ARRAY_SIZE];
memset (long_array, 0, ARRAY_SIZE);
return 0;
}
计划2
#include <stdio.h>
#include <string.h>
#define ARRAY_SIZE 0x320204
int main ()
{
unsigned long long_array[ARRAY_SIZE] = {0};
//memset (long_array, 0, ARRAY_SIZE);
return 0;
}
两个程序都给出了分段错误。
请说明如何初始化这个长尺寸阵列。在此先感谢。
答案 0 :(得分:4)
分段错误是因为您尝试在堆栈0x320204
long
上进行分配,这可能太多了。在十进制中,这是3277316 * sizeof(unsigned long)
,在我的机器上是3277316 * 8 = 26218528
个字节,即大约25 MB。
初始化它的第二种方法是最常见的,它将使所有元素归零。第一种方法只会将第一个ARRAY_SIZE
字节归零,但请记住sizeof(unsigned long)
通常为8
个字节,因此您需要将sizeof(unsigned long) * ARRAY_SIZE
个字节归零。
答案 1 :(得分:0)
你可以做的是使用calloc
,这只是一个电话,对很多人来说更清楚,虽然不是什么大问题,并且使用堆,这是最大的好处。一旦你想要制作非常大的数组(或对象,或其他),堆就适合你。最终,使用堆栈这种东西是不实际的,并且可能会导致堆栈溢出错误。另外,您可以将从calloc
返回的指针传递给任何需要担心分配的内存会发生什么的指针。这与堆栈不同,它可能会在函数返回时被覆盖,这种情况多次发生在我身上,造成了很难修复的错误。然而,calloc
有一些缺点,就像它很慢,但在这种情况下一样快memset
。但是如果你真的不需要将所有位设置为0,你可以使用malloc
(更快更流行)。 calloc
或malloc
的第二个缺点是你必须在指针上调用free
,否则你会泄漏内存。以下是calloc
:
#include <stdlib.h> // or "#include <cstdlib>" in C++
/* Allocate space for array, set all bytes to 0,
and return pointer. Then assign to long_array.
*/
unsigned long* long_array = (unsigned long*) calloc(ARRAY_SIZE);
// When you're done with this variable:
free(long_array);
很容易。 calloc
和malloc
都是为这种东西而制作的。我希望这有帮助!
注意:虽然这些链接指向C ++网站,但您仍然可以通过包含<stdlib.h>