1

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

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

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

4

2 回答 2

8

您可以使用void *calloc(size_t nmemb, size_t size);函数来初始化内存0

calloc()函数为每个大小字节的元素数组分配内存,nmemb并返回一个指向已分配内存的指针。 内存设置为zero 如果nmembor size 是0,则calloc() 返回其中一个NULL,或者返回一个唯一的指针值,该指针值稍后可以成功传递给free().

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

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

注意: calloc()也不是魔法——它还会某处使用循环来用全零替换垃圾。

另请参阅: 为什么malloc()+memset()比 慢calloc()

于 2013-07-27T14:11:38.727 回答
0

无论您做什么,都无法消除初始化时间。你能做的最好的就是尝试优化它。想到2个技巧:

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

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

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

于 2013-07-27T14:18:32.783 回答