c-malloc成功,但分配失败



我们使用malloc函数成功地为x_space分配了内存。但是,它在为它们赋值时失败了。感谢您的关注。

以下是Liblinear(一个开源svm工具)的train.c。

#include<stdio.h>
#include<stdlib.h>
struct feature_node
{
    int index;
    double value;
};
void main()
{
    struct feature_node * x_space;
    long j;
    x_space =(struct feature_node *)malloc(306396532*sizeof(struct feature_node));
    if(x_space)
    {
        for(j=0;j<306396532;j++)
            x_space[j].index=0;  /* fail when j=37961212, ACCESS VIOLATION */
    }
    else        
        printf("malloc failed.n");
    puts("End");
    getchar();
}

我猜您所在的机器的处理器无法访问超过4GB的单个内存段(即32位地址空间)。你的编译器和/或库不够聪明,当你分配4.5GB(假设是32位int和64位long)时不会失败,所以当你试图访问它时,它会失败。

与其分配一个结构数组,不如为int和double尝试单独的数组。这可能会让他们处于极限之下。

你有一个环绕,所以你分配的比你想象的要少得多。

假设double必须在8个字节上对齐,则sizeof(struct feature_node)是16(4+8+4填充)。在32位机器上,306396532*sizeof(struct feature_node)应该是4.8GB,但这大约是0.8GB,这是malloc得到的,也是它分配的。稍后,循环尝试访问超出分配的内容,但失败了。

此程序向您显示有关计算机内存的一些信息,这样你就可以在分配内存之前获得信息,我希望这对你有用:

#include <windows.h>
#include <stdio.h>
#include <psapi.h>
#define DIV 1048576
#define WIDTH 7
void  main()
{
  MEMORYSTATUSEX statex;
  statex.dwLength = sizeof (statex);
  GlobalMemoryStatusEx (&statex);

   printf (TEXT("There is  %*ld percent of memory in use.n"),WIDTH, statex.dwMemoryLoad);
   printf (TEXT("There are %*I64d total Mbytes of physical memory.n"),WIDTH,statex.ullTotalPhys/DIV);
   printf (TEXT("There are %*I64d free Mbytes of physical memory.n"),WIDTH, statex.ullAvailPhys/DIV);
   printf (TEXT("There are %*I64d total Mbytes of paging file.n"),WIDTH, statex.ullTotalPageFile/DIV);
   printf (TEXT("There are %*I64d free Mbytes of paging file.n"),WIDTH, statex.ullAvailPageFile/DIV);
   printf (TEXT("There are %*I64d total Mbytes of virtual memory.n"),WIDTH, statex.ullTotalVirtual/DIV);
   printf (TEXT("There are %*I64d free Mbytes of virtual memory.n"),WIDTH, statex.ullAvailVirtual/DIV);
   printf (TEXT("There are %*I64d free Mbytes of extended memory.n"),WIDTH, statex.ullAvailExtendedVirtual/DIV);
}

使用gcc x.c-o x-lpsapi 编译

相关内容

  • 没有找到相关文章

最新更新