2014-09-29 161 views
-2

我有以下C代碼,其給出了一個錯誤:C代碼停止運行

Program stopped at 0x4019b3. 
It stopped with signal SIGSEGV, Segmentation fault. 

調試時。

下面是代碼:

#include <stdio.h> 
#include <complex.h> 
#include <stdlib.h> 
#include <time.h> 
int main() 
{ 
    clock_t begin, end; 
    double time_spent; 

    begin = clock(); 

    int n = 100;int i; int j; 
    int N = 64;int r; 
    double complex (s)[4] = {-1-1*I, -1+1*I, 1-1*I, 1+1*I}; 
    double complex symbol[n][N]; 
    for (i=0; i<n; i++){ 
     for (j=0; j<N; j++){ 
      r = rand() % 4; 
      symbol[i][j]=s[r]; 
     } 
     // Now add pilots: 
     symbol[i][11] = 1; 
     symbol[i][22] = 1; 
     symbol[i][33] = 1; 
     symbol[i][44] = 1; 
    } 
    end = clock(); 
    time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
    return 0; 
} 

任何想法有什麼不對?

編輯:

現在,我可以把這些有價值的討論後,把它放在一起。下面是時間和內存分配和每一件事情的工作代碼:

#include <stdio.h> 
#include <complex.h> 
#include <stdlib.h> 
#include <time.h> 
int main() 
{ 
    clock_t begin, end; 
    double time_spent; 
    begin = clock(); 

    int n = 100000; int i; int j; 
    int N = 64;int r; 
    double complex (s)[4] = {-1-1*I, -1+1*I, 1-1*I, 1+1*I}; 
    double complex (*symbol)[N] = malloc(n * sizeof *symbol); 
    for (i=0; i<n; i++){ 
     for (j=0; j<N; j++){ 
      r = rand() % 4; 
      symbol[i][j]=s[r]; 
     } 
     // Now add pilots: 
     symbol[i][11] = 1; 
     symbol[i][22] = 1; 
     symbol[i][33] = 1; 
     symbol[i][44] = 1; 
    } 
    end = clock(); 
    time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
    printf("%3.7f\n",time_spent); 
    return 0; 
} 
+1

你做了什麼 - 如果有的話 - 試圖找出這個問題? – 2014-09-29 02:28:50

+0

你需要在某處分配內存 – almanegra 2014-09-29 02:31:45

+0

這行是錯誤的:'複數(*符號)[n] [N] = malloc(n * sizeof *符號);'。更仔細地從R Sahu的回答中複製出來。你也到處都冒出了虛假的'*'。它應該是'symbol [i] [j]',而不是'* symbol [i] [j]',對於所有的飛行員來說都是一樣的。 – 2014-09-29 02:58:51

回答

3

內存來容納行

double complex symbol[100000][64]; 

聲明的變量需要的是太多的堆棧。

運行64位機器時,即使像下面這樣簡單的程序也會遇到Segmentation故障。

#include <stdio.h> 
#include <complex.h> 

void foo() 
{ 
    double complex symbol[100000][64]; 
    printf("%zu\n", sizeof(symbol)); 
} 

int main(int argc, char** argv) 
{ 
    foo(); 
    return 0; 
} 

考慮從堆中分配內存,例如:

double complex (*symbol)[N] = malloc(n * sizeof *symbol); 

另一個問題是,在循環:

for (i=0; i<n; i++){ 
    for (j=0; i<N; j++){ // Problem line 
     r = rand() % 4; 
     symbol[i][j]=s[r]; 
    } 

您範圍內存的訪問的。問題行應更改爲:

for (j=0; j<N; j++){ 
       ^^ Use j not i 
+2

哪裏有一個問題,通常有不止一個...... – 2014-09-29 02:34:22

+0

@R Sahu這不是記憶。我嘗試'符號[10] [64]'並得到相同的錯誤。但是調試器指向符號[i] [j] = s [r];'。 – AboAmmar 2014-09-29 02:41:16

+1

@AboAmmar按照MitchWheat的回答建議,您正在訪問'symbol'數組的界限。您需要修復這兩個問題以使您的代碼正常工作。 – 2014-09-29 02:49:21

1

您的第二個循環測試中的複製和粘貼錯誤:

for (j=0; j<N; j++){ 
     ^

應該j沒有i

[另外,無關,但你不應該使用模%rand()的結果,因爲低位不像高位那樣隨機。改爲使用除法。]

[另一個答案指出,你也可能會耗盡你的堆棧,儘管我會期待一個不同的錯誤。值得一試,雖然]

+0

我不認爲這會解決問題 – almanegra 2014-09-29 02:31:09

+0

@almaneg:爲什麼?這是一個無限循環 – 2014-09-29 02:31:58

+0

Re。隨機性問題,這將取決於哪個PRNG正在使用 – 2014-09-29 02:32:00