2013-07-20 2 views
-1

malloc 함수를 사용하여 x_space에 대한 메모리를 성공적으로 할당했습니다. 그러나 값을 할당하는 동안 실패했습니다. 주목 해 주셔서 감사합니다.malloc 성공했지만 할당 실패

다음은 Liblinear (open source svm tool)의 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

힌트 :'306396500 * sizeof (double)'이 (으)로 평가되는 것은 무엇입니까? 그리고 int 형은 얼마나 큰가? – Mysticial

+4

'malloc'이 어떻게 성공했는지 어떻게 알았습니까? 당신은'malloc'의 리턴 값을 확인하지 않았습니다 –

+0

@YuHao 실패한 경우, 첫 번째 반복에서 충돌했을 가능성이 있습니다. – Mysticial

답변

3

4GB 이상의 단일 메모리 세그먼트 (32 비트 주소 공간)에 액세스 할 수없는 프로세서가있는 컴퓨터를 추측하고 있습니다. 컴파일러 및/또는 라이브러리는 4.5GB (32 비트 int 및 64 비트 long으로 가정)를 할당 할 때 실패 할 정도로 똑똑하지 않으므로 나중에 액세스하려고 할 때 실패합니다.

구조체 배열을 할당하는 대신 int 배열과 double 배열을 분리 해보십시오. 그것은 단지 그것들을 한계 이하로 유지할 수 있습니다.

+0

감사합니다. Windows Xp (32 비트) 및 Windows 2003 Server Enterprise (32 비트)에서 실행했습니다. 그리고 액세스 위반 오류가 발생했습니다. – Eman

+0

64 비트에서 잘 작동합니다. –

+0

이 프로그램을 CentOS 64bit에서 테스트 한 결과 성공했습니다. – Eman

0

랩 어라운드가있어서 생각보다 훨씬 적게 할당 할 수 있습니다.

double이 8 바이트로 정렬되어야한다고 가정하면 sizeof(struct feature_node)은 16 (4 + 8 + 4 패딩)입니다. 32 비트 시스템에서는 306396532*sizeof(struct feature_node)이 4.8GB가되어야하지만, 이것은 0.839GB로 돌아갑니다. 즉, 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 컴파일

관련 문제