2016-07-18 78 views
0

我試圖寫C.陣列(2x20000)的測試的代碼是:數組聲明:C分段故障

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

double test(int smod) 
{ 
// 
// test subroutine 
// 
double vect_fma[2][20000]; 
int i; 

// write on file // 
FILE *f = fopen("file.txt", "w"); 
/////////////////// 

    for(i = 1; i < 20001; i = i + 1){  
    // allocate the vector for the fma analysis 
    vect_fma[1][i] = i*smod; 
    vect_fma[2][i] = i*smod; 
    if (i%smod == 0) 
    fprintf(f, "%f %f %f \n", 1.0*i, vect_fma[1][i],vect_fma[2][i]); 
}  
    fclose(f); 
    return 0; 
} 


int smod; 
void main() 
{ 
    smod = 10; // every 10 print the output 
    test(smod); // call the function 
} 

我與gcc test.c -lm -o test編譯的代碼和我收到Segmentation fault (core dumped)

據我所知,「the compiler tries to store it on the stack」和解決方案可能是鏈接頁面中呈現的解決方案....但解決方案看起來很奇怪(並且理解複雜),如果與更簡單的fortran聲明數組real(8), dimension(n:m) :: vect_fma,我可以放入一個子程序或一個沒有問題的函數中。 也許是我在代碼中寫的聲明與fortran real(8), dimension(n,m),allocatable :: vect_fma類似?

所以問題是,它存在一個簡單的方法在C中聲明一個函數內的數組? 非常感謝大家。

+0

可能對於堆棧太大 - 使用堆而不是 –

+0

@EdHeal類似於'2d_array =(int *)malloc(sizeof(int)* N * M);'? –

+0

編譯過程中(這是您的答案意味着什麼)或執行過程中是否收到分段錯誤? – CorbinMc

回答

2

你有多個地方的越界訪問,這是未定義的行爲。 在C中,數組索引的範圍從0N-1,而不是從1N。這意味着,環路部分重寫:

for(i = 0; i < 20000; i = i + 1){  
    // allocate the vector for the fma analysis 
    vect_fma[0][i] = i*smod; 
    vect_fma[1][i] = i*smod; 
    if (i%smod == 0) 
     fprintf(f, "%f %f %f \n", 1.0*i, vect_fma[0][i],vect_fma[1][i]); 
}  

有可能2x20000雙打可能是太大了系統上的堆棧大小,你最好離固定不確定的行爲,第一 ,看看問題是否會消失。

+0

感謝您的回答,關於整數是正確的,並感謝所發佈的示例。我與Fortran混合起來,從1到20000開始,這意味着我有20000個元素,而在C中,我必須從0開始到20000。 –

+0

0到19999不是20000,因爲是<20000 – Michi

2

問題是您的for循環。您應該從i=0開始迭代,並以迭代結束i=19999。您的代碼以i=1的迭代開始,並以迭代結束,其中i=20000

問題是沒有數組的第20000個元素,只有19999th(零索引)。當您訪問第20000個元素時,您的訪問系統內存永遠不會分配給導致分段錯誤的程序。

修復你的循環,你應該很好。