malloc成功但分配失败

时间:2013-07-20 07:23:50

标签: c malloc

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

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

#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();
}

3 个答案:

答案 0 :(得分:3)

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

不是分配结构数组,而是为int和double尝试单独的数组。这可能只是让他们处于极限之下。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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 x.c -o x -lpsapi

进行编译
相关问题