我们使用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();
}
答案 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
进行编译