C程序 - 如何初始化长尺寸阵列

时间:2015-10-14 19:39:54

标签: c arrays memset

我有这样的程序,

计划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;
}

两个程序都给出了分段错误。

请说明如何初始化这个长尺寸阵列。在此先感谢。

2 个答案:

答案 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(更快更流行)。 callocmalloc的第二个缺点是你必须在指针上调用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);

很容易。 callocmalloc都是为这种东西而制作的。我希望这有帮助!

注意:虽然这些链接指向C ++网站,但您仍然可以通过包含<stdlib.h>

在纯C中使用这些功能
相关问题