-1

我们使用 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();
}
4

3 回答 3

3

我猜你的机器上的处理器无法访问超过 4GB 的单个内存段(即 32 位地址空间)。当您分配 4.5 GB(假设 32 位整数和 64 位长整数)时,您的编译器和/或库不够聪明,无法失败,因此稍后当您尝试访问它时它会失败。

不要分配结构数组,而是为 int 和 double 尝试单独的数组。这可能会使它们保持在限制之下。

于 2013-07-20T08:53:16.043 回答
0

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

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

于 2013-07-20T09:59:05.373 回答
0

该程序向您展示了有关计算机内存的一些信息,因此您可以在分配内存之前获取信息,希望对您有用:

#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 xc -ox -lpsapi 编译

于 2013-07-20T10:03:54.000 回答