-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 ビット int と 64 ビット long) を割り当てたときに失敗するほどスマートではないため、後でアクセスしようとすると失敗します。

構造体の配列を割り当てる代わりに、int と double に別々の配列を試してください。それはそれらを制限の下に保つだけかもしれません。

于 2013-07-20T08:53:16.043 に答える
0

ラップアラウンドがあるため、予想よりもはるかに少ない割り当てになります。

double8 バイトでアラインする必要があると仮定すると、 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 に答える