在我的C代碼中,我爲2d數組分配內存double E[2000][2000];
,但是當我運行它時得到運行時錯誤Segmentation fault(core dumped)
,並且當我將數組大小減小到900左右時,代碼運行良好。無法分配內存
爲什麼它顯示運行時錯誤,因爲double取64位內存(IEEE標準),因此代碼大約需要32MB,與ram大小相比並不多。如果C中不支持,那麼我應該如何繼續如果我必須存儲的最大數據量是4000000,則每個數據都是浮點數。
在我的C代碼中,我爲2d數組分配內存double E[2000][2000];
,但是當我運行它時得到運行時錯誤Segmentation fault(core dumped)
,並且當我將數組大小減小到900左右時,代碼運行良好。無法分配內存
爲什麼它顯示運行時錯誤,因爲double取64位內存(IEEE標準),因此代碼大約需要32MB,與ram大小相比並不多。如果C中不支持,那麼我應該如何繼續如果我必須存儲的最大數據量是4000000,則每個數據都是浮點數。
您是否將E聲明爲局部變量?如果是這樣,你的堆棧內存不足。
void func()
{
double E[2000][2000]; /// definitely an overflow
}
使用動態分配:
double* E = malloc(2000 * 2000 * sizeof(double));
/// don't forget to "free(E);" later
或者,如果你需要的二維數組,用曲折的:
double** E = malloc(2000 * sizeof(double*));
/* check that the memory is allocated */
if(!E)
{
/* do something like exit(some_error_code); to terminate your program*/
}
for(i = 0 ; i < 2000 ; i)
{
E[i] = malloc(2000 * sizeof(double));
/* check that the memory for this row is allocated */
if(!E[i])
{
/* do something like exit(some_error_code); to terminate your program*/
}
}
然後重新分配是一個有點複雜:
for(i = 0 ; i < 2000 ; i)
{
free(E[i]);
}
free(E);
PS如果你想保持你的數據在一個連續的方式,有一個訣竅(代碼Takuya Ooura's FFT Package)
double **alloc_2d(int n1, int n2)
{
double **ii, *i;
int j;
/* pointers to rows */
ii = (double **) malloc(sizeof(double *) * n1);
/* some error checking */
alloc_error_check(ii);
/* one big memory block */
i = (double *) malloc(sizeof(double) * n1 * n2);
/* some error checking */
alloc_error_check(i);
ii[0] = i;
for (j = 1; j < n1; j++) {
ii[j] = ii[j - 1] + n2;
}
return ii;
}
void free_2d(double **ii)
{
free(ii[0]);
free(ii);
}
的你只需要調用
double** E = alloc2d(2000, 2000);
和
free_2d(E);
'malloc/free'代替'C'的'new/delete'嗎? –
解決了這個問題,謝謝 –
另外,由於動態分配可能會失敗,因此在使用它之前,請檢查'malloc()'返回的NULL值。 – unwind
我承擔你只是簡單地將它分配在堆棧上
這可能會超過分配給程序的堆棧大小。
嘗試使用malloc(或C++中的new)或使用選項增加程序的默認堆棧大小。爲此,可以使用setrlimit()配置gcc。
請記住,即使堆棧大小增加時,這個大小的數組應該是全球性
你也可以使用一個語句就堆上分配一個二維數組,如果一個維度固定大小
double (* E)[COLUMN_SIZE];
int rows = 20; // this is dynamic and can be input from user at run time
E = malloc(rows * sizeof(*E)); // this needs to be freed latter
的更詳細的類似的例子 allocating 2d array without loops
更好:'E = malloc(rows * sizeof(* E))''。不必再次提及行大小,因爲您不必。 –
從我+1更多分配選項 –
謝謝你剛剛意識到你提到。在答案中編輯 – fayyazkl
這取決於你分配陣列的位置。使用堆棧空間可能會導致溢出(除非你讓鏈接器分配一個額外的大堆棧)。
例如,這可能無法正常工作
int main()
{
double E[2000][2000]; // Likely an overflow
}
然而,陣列移動到靜態存儲區域
double E[2000][2000];
int main()
{
// use E here
}
可能會避免此問題。
請向我們展示如何分配內存。 – Zeta