C程序-如何初始化长数组
我有这样的节目 计划1C程序-如何初始化长数组,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() { 无符号长数
#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
的第二个缺点是必须调用指针,否则会泄漏内存。下面是如何使用calloccalloc
:
#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
的第二个缺点是必须调用指针,否则会泄漏内存。下面是如何使用calloccalloc
:
#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