2013-07-20 72 views
-1

我們使用malloc函數爲x_space成功分配了內存。但是,在爲其分配值時失敗。感謝您的關注。malloc成功但分配失敗

以下是來自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(); 
} 
+4

提示:'306396500 * sizeof(double)'評估的是什麼? 'int'類型有多大? – Mysticial

+4

你怎麼知道'malloc'成功了?你沒有檢查'malloc'的返回值。 –

+0

@YaoHao如果失敗了,那很有可能,它會在第一次迭代時崩潰。在進入循環之前,sizeof(double)的大小是(size)( – Mysticial

回答

3

我猜你在一臺處理器無法訪問超過4GB(這是一個32位地址空間)的單個內存段的機器上。當您分配4.5 GB(假設32位整數和64位長整數)時,您的編譯器和/或庫不夠智能,以致於在嘗試訪問它時稍後失敗。

而不是分配一個結構數組,嘗試單獨的數組爲int和double。這可能會讓他們超出限制。

+0

謝謝。我在Windows XP(32位)和Windows 2003 Server Enterprise(32位)上運行它。我們得到了訪問衝突錯誤。 – Eman

+0

在64位上工作良好。 – 2013-07-20 09:22:29

+0

我在CentOS 64bit上測試了這個程序併成功。 – Eman

0

你有一個環繞式的,所以你分配得比你想象的要少得多。

假設double必須在8個字節上對齊,那麼sizeof(struct feature_node)是16(4 + 8 + 4填充)。在一臺32位的機器上,306396532*sizeof(struct feature_node)應該是4.8GB,但是這個數據包可以轉換爲0.8GB,這就是malloc得到的結果,以及它分配的內容。之後,循環嘗試訪問超出分配的內容,並失敗。

+0

我在CentOS 64bit上測試了這個程序併成功。 – Eman

+0

4.9GB不會在64位溢出。 – ugoren

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編譯