【问题标题】:C Program - How to initialize a Long Size ArrayC 程序 - 如何初始化长数组
【发布时间】:2015-10-14 19:39:54
【问题描述】:

我有一个这样的程序,

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

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

请说明如何初始化这个长数组。提前致谢。

【问题讨论】:

  • 代码在尝试分配这个“巨大”数组时可能达到了堆栈的大小限制。
  • 这个“memset (long_array, 0, ARRAY_SIZE);”很可能不会像您预期的那样(但很少)。
  • 非常相似的问题就像 10 分钟前一样......
  • 数字0x320204等于3277316,大于堆栈大小。
  • 除了ARRAY_SIZE是一个很大的数字之外,代码应该是memset(long_array, 0, sizeof *long_array * ARRAY_SIZE);或者更好的memset(long_array, 0, sizeof long_array);

标签: c arrays memset


【解决方案1】:

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

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

【讨论】:

  • 而不是“需要归零8 * ARRAY_SIZE字节”,建议“需要归零sizeof (unsigned long long) * ARRAY_SIZE字节”或“需要归零sizeof long_array字节”。从而避免像 8 这样的幻数。
  • 已编辑,OP 使用的是long(不是long long
  • @AlterMann 谢谢,我的错误,当我浏览代码时有 2 个相邻的 long,并没有意识到最后一个是名称的一部分 :)
  • @Alter Mann 您的评论很好地说明了为什么使用sizeof var 而不是sizeof(type)
  • @chux 我想最好的办法是使用ARRAY_SIZE * sizeof *array_name,即使您稍后决定更改类型也不会出现任何问题。
【解决方案2】:

你可以做的是使用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++ 网站,但您仍然可以通过包含 &lt;stdlib.h&gt; 在纯 C 中使用这些函数

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多