【问题标题】:C can't allocate enough memoryC 无法分配足够的内存
【发布时间】:2023-04-05 11:37:02
【问题描述】:

下面的代码没有给出任何分配错误,但是计数在大约 16970 处结束,出现内存分配错误并且系统停止 ,我用的是 Turbo C++ 3.0 IDE ,Windows XP sp3 , 所有分区:NTFS ,PC : Dell 1545 安装了 2 GB 内存。

#include <stdio.h>
#include <stdlib.h>

long counter=0;
int main(int argc, char *argv[])
    {
        char* array=(char*) malloc (1024*1024*10);
        if (array==NULL) 
            {
                /* allocation error */
                return 1;
            }
         for (counter=0 ; counter<10000000;counter++)
         array[counter] = 1;  // trying to fill the array with one's
        free (array);
        return 0;
    }

【问题讨论】:

  • @Meninx:这会是什么宇宙? 1024*1024*10 -&gt; 10,485,760,绝对不小于10,000,000
  • TC++ .. 再次.. 摆脱这个古董!
  • Turbo C++ 3.0 已经很老了。它的ints 是否可能只有 16 位宽?
  • 尝试打印1024*1024*10 的评价,看看是否符合您的预期。
  • 或打印sizof(int)

标签: c malloc


【解决方案1】:

Turbo C++ 在 DOS 环境中工作,在实模式下工作,除非您特别启用保护模式。在实模式下,内存空间被分成 64kbyte 的段,size_t(malloc 的参数)很容易变成 16 位。 1024*1024*10 mod 65536 = 0,所以上面对 malloc 的调用结果为malloc(0)

malloc(0) 的返回值是实现定义的,并且可以是非零值。 (what does malloc(0) return?) 使用返回的指针是个坏主意,Windows XP 可能会干预内存分配错误。

【讨论】:

  • ( 1024*1024*10 mod 65536 = 0, 所以上面对 malloc 的调用适用于 malloc(0) ) ,这应该返回一个 'NULL' 指针,但这不会发生!
  • 那么,这里的问题出在 TC++ 编译器上吗?那么,我应该更换它吗?
  • @howard 是的,你应该用更新的东西替换这个编译器。 (你可能应该用更新的东西替换 Windows XP,当你在它的时候。;-)
  • 'farmalloc' 怎么样?我应该用 ms dos 编译器完成这个项目
  • @Howard: malloc(0) 被允许返回一个指向零字节内存的有效指针。
猜你喜欢
  • 2016-06-19
  • 2017-04-04
  • 2021-03-31
  • 2021-06-12
  • 2020-05-05
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多