C程序-如何初始化长数组

C程序-如何初始化长数组,c,arrays,memset,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; } #包括 #包括 #定义数组大小0x320204 int main() { 无符号长数

我有这样的节目

计划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;
}
#包括
#包括
#定义数组大小0x320204
int main()
{
无符号长数组[数组大小];
memset(长数组,0,数组大小);
返回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;
}
#包括
#包括
#定义数组大小0x320204
int main()
{
无符号长数组[数组大小]={0};
//memset(长数组,0,数组大小);
返回0;
}
两个程序都给出了分段错误


请说明如何初始化此长数组。提前感谢。

分段错误是因为您试图在堆栈上分配
0x320204
long
s,这可能太多了。在十进制中,这是
3277316*sizeof(unsigned long)
,在我的机器上是
3277316*8=26218528
字节,即大约25 MB


第二种初始化方法是最常见的,它将使所有元素归零。第一种方法只会将第一个
ARRAY\u SIZE
字节归零,但请记住
sizeof(unsigned long)
通常是
8
字节,因此您需要将
sizeof(unsigned long)*ARRAY\u SIZE
字节归零。

分段错误是因为您试图在堆栈上分配
0x320204
long
s,这可能太过分了。在十进制中,这是
3277316*sizeof(unsigned long)
,在我的机器上是
3277316*8=26218528
字节,即大约25 MB

第二种初始化方法是最常见的,它将使所有元素归零。第一种方法只会将第一个
ARRAY\u SIZE
字节归零,但请记住
sizeof(unsigned long)
通常是
8
字节,因此您需要将
sizeof(unsigned long)*ARRAY\u SIZE
字节归零。

您可以做的是使用,这只是一个调用,对很多人来说更清楚,虽然不是什么大问题,并使用堆,这是最大的好处。一旦您想要创建真正大的数组(或对象,或其他),堆就是您的位置。最终,将堆栈用于此类内容是不实际的,并且可能会导致堆栈溢出错误。另外,您可以将从
calloc
返回的指针传递给任何需要担心分配的内存会发生什么情况的对象。这与堆栈不同,在堆栈中,一旦函数返回,它可能会被覆盖,这在我身上已经发生了很多次,产生了非常难以修复的bug。然而,
calloc
也有缺点,比如它的速度非常慢,但在本例中与
memset
一样快。但是如果你真的不需要所有的位都设置为0,你可以使用(更快更流行)。
calloc
malloc
的第二个缺点是必须调用指针,否则会泄漏内存。下面是如何使用calloc
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);
<代码>包含/ /或“+包含”在C++中 /*为数组分配空间,将所有字节设置为0, 并返回指针。然后分配给long_数组。 */ 无符号长*长*数组=(无符号长*)calloc(数组大小); //使用完此变量后: 自由(长_数组); 就这么简单。
calloc
malloc
都是为这种东西制作的。我希望这有帮助

注意:虽然这些链接是C++的,但是你仍然可以在纯C中使用这些函数,包括<代码> <代码>

你可以做的是使用,这只是一个调用,对很多人来说更清楚,虽然不是很大,但是使用堆,这是最大的好处。一旦您想要创建真正大的数组(或对象,或其他),堆就是您的位置。最终,将堆栈用于此类内容是不实际的,并且可能会导致堆栈溢出错误。另外,您可以将从
calloc
返回的指针传递给任何需要担心分配的内存会发生什么情况的对象。这与堆栈不同,在堆栈中,一旦函数返回,它可能会被覆盖,这在我身上已经发生了很多次,产生了非常难以修复的bug。然而,
calloc
也有缺点,比如它的速度非常慢,但在本例中与
memset
一样快。但是如果你真的不需要所有的位都设置为0,你可以使用(更快更流行)。
calloc
malloc
的第二个缺点是必须调用指针,否则会泄漏内存。下面是如何使用calloc
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);
<代码>包含/ /或“+包含”在C++中 /*为数组分配空间,将所有字节设置为0, 并返回指针。然后分配给long_数组。 */ 无符号长*长*数组=(无符号长*)calloc(数组大小); //使用完此变量后: 自由(长_数组); 就这么简单。
calloc
malloc
都是为这种东西制作的。我希望这有帮助


注:虽然这些链接是C++的网站,但仍然可以在纯C中使用这些函数,包括<代码> <代码> < /p>当试图分配这个“巨大”数组时,代码可能会达到栈的大小限制。。类似的问题在10分钟前就出现了……数字0x320204等于3277316,大于堆栈大小。除了
ARRAY\u size
是一个大数字之外,代码应该是
memset(long\u ARRAY,0,sizeof*long\u ARRAY*ARRAY\u size)
或更好的
memset(long_数组,0,long_数组的大小)
当试图分配这个“巨大”数组时,代码可能会达到堆栈的大小限制。这个“
memset(long\u array,0,array\u size);
”很可能不会达到您预期的效果(但很少)。非常类似的问题在10分钟前就出现了……数字0x320204等于3277316