【问题标题】:Error allocating memory of unsigned longs in C在 C 中分配无符号长的内存时出错
【发布时间】:2014-12-22 15:28:52
【问题描述】:

我正在编写一个需要使用一些非常大的数组的 C 程序。我通过调用为我的数组分配内存:

unsigned long *visited = declareArrayofLongs(my_pow(2, d));

declareArrayofLongs() 函数是:

unsigned long int* declareArrayofLongs(unsigned long int length)
{
    unsigned long int *myarray = (unsigned long int*) malloc(length*sizeof(unsigned long int));
    if (myarray==NULL)
        printf("Error allocating memory for unsigned longs!\n");
    unsigned long int i;
    for(i=0; i<length; i++)
        myarray[i] = 0;
    return myarray;
}

my_pow()

unsigned long int my_pow(int base, int exp)
{
    unsigned long int pow=1;
    int i=0;
    for(i=0; i<exp; i++){
        pow = (unsigned long int)base*pow;
    }
    return pow;
}

当程序运行并达到 d=29 左右时,我收到“为 unsigned long 分配内存时出错!”。我的系统上有 16GB 的 RAM。我不应该能够处理这么多的分配吗?

一次只声明一个visited 数组。在重新分配之前,我有一个free(visited) 电话。

【问题讨论】:

  • 这并不取决于您使用的硬盘数量。这取决于操作系统为您分配了多少堆内存。
  • 如果您查看映射文件或链接描述文件,它可以帮助您了解您的程序有多少堆内存可用。这真的不取决于你的物理记忆。
  • 虽然和你的问题无关,但不要投malloc()的返回值。见stackoverflow.com/q/605845/3488231
  • 1) sizeof(unsigned long): 4, 8, 是什么? 2)SIZE_MAX的值是多少?
  • @twalberg:在执行进程时,整个可执行映像是否必须在内存中?我非常(尽管不完全)确定它不会。

标签: c malloc


【解决方案1】:

你没有显示 my_pow。既然你的代码不起作用,是什么让你认为它做了你认为它做的事?

您可能正在运行 32 位代码,在这种情况下,无论 RAM 有多少,您都不会获得超过 3GB 的内存。

【讨论】:

  • 我已将 my_pow 函数添加到我的原始帖子中。该代码适用于较小的 d 值,只有当 d 变大(大约 29)时,我才会收到分配错误。
  • @theGman 如果这是一个 32 位系统(我猜是),并且 unsigned long 是 4 个字节,那么您在 @theGman 中要求 2^31 个字节的内存当d == 29时拨打987654323@。这可能超出了 C 库所允许的范围,尽管由于您没有提及您使用的平台和编译器,我们无法真正说出具体限制...
  • @twalberg,我在 64 位 Windows 系统上运行 cygwin,但我认为 cygwin 可能是 32 位版本。我正在用 gcc 编译。
  • @theGman 在这种情况下,假设您的 gcc 是 Cygwin 附带的,而不是在其上加载的另一个版本,它可能只能编译 32 位应用程序,它们很可能不支持 2^31 字节的分配请求(有关更多详细信息,请参阅问题中的 cmets)。您可以通过运行gcc -v 来验证编译器目标架构。如果它显示Target: i?86-something(也可能是x86_32 - 我没有方便验证),它是一个32 位编译器。如果它显示Target: x86_64-something,它是 64 位的。您可以尝试安装 64 位 Cygwin...
  • @iharob 这篇文章的最后一句话实际上是正确答案,恕我直言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多