如何使用默认值动态初始化数组?

时间:2013-07-27 14:09:39

标签: c

我在C 4.3.2中初始化大小为100000000的数组(unsigned short int),以及其他两个大小为1000000的int数组。但是在提交在线判断时,它给出了SIGSEGV错误。

因此我决定使用默认值0动态初始化我的数组,因为循环添加值需要很长时间。

我的问题是如何使用默认值动态初始化数组?

2 个答案:

答案 0 :(得分:8)

您可以使用void *calloc(size_t nmemb, size_t size);函数使用0

初始化内存
  

calloc()函数为nmemb元素数组分配内存          每个大小字节数,并返回指向已分配内存的指针。          内存设置为zero如果nmemb或尺寸为0,则calloc()          返回NULL或稍后可以使用的唯一指针值          已成功传递至free()

 calloc(number of elements, sizeof(type));

或者您也可以显式使用memset()来初始化malloc()调用分配的内存。

注意: calloc()也不是魔术 - 它在某处使用循环来用全零替换垃圾。

另请参阅: Why malloc() + memset() is slower than calloc()?

答案 1 :(得分:0)

无论你做什么,都无法消除初始化时间。您可以做的最好的事情是尝试优化它。我想到了两种技术:

  • 有效使用您的硬件。使用本机大小的内存访问来初始化缓冲区。例如,超过32位架构循环并以4字节块的形式写入。
  • 展开循环以消除控制开销。

无论如何,通过优化编译器可能会应用展开。

您还可以尝试将初始化开销移至非关键部分。例如,您可以使用在程序启动时零初始化的静态变量。或者,相反,您可以将初始化延迟到第一次使用(延迟初始化)。