2014-09-29 2 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; 
} 

Любая идея, что это не так?

EDIT:

Теперь я могу поставить все это вместе после того, как это ценное обсуждение. Вот рабочий код с синхронизации и распределения памяти и каждая вещь:

#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

Что вы сделали - если что-нибудь - попытаться выяснить эту проблему? –

+0

Вам нужно выделить память где-то – almanegra

+0

Эта строка неверна: 'double complex (* symbol) [n] [N] = malloc (n * sizeof * symbol);'. Копируйте более тщательно из ответа R Sahu. Также вы повсеместно прорастали поддельными '*'. Он должен быть символом [i] [j] ', а не' * symbol [i] [j] 'и одинаковым для всех пилотов. –

ответ

3

памяти требуется для хранения переменной, объявленной линией

double complex symbol[100000][64]; 

слишком много для стека.

Даже простая программа, подобная приведенной ниже, вызывает ошибку Сегментации при запуске 64-разрядной машины.

#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

Там, где есть одна проблема, обычно более одного ... –

+0

@R Sahu Это не память. Я пытаюсь 'symbol [10] [64]' и получить ту же ошибку. Но отладчик указывает на строку 'symbol [i] [j] = s [r];'. – AboAmmar

+1

@AboAmmar вы получаете доступ к границам массива 'symbol', как это было предложено MitchWheat. Вам нужно исправить * оба * этих проблем, чтобы ваш код работал. –

1

У вас есть копия и ошибка вставки в вашем втором тесте петли:

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

Это должно быть j не i

[Кроме того, не связанный, но вы не должны использовать модуль % по результату rand(), потому что младшие разряды не так случайны, как высокие биты. Вместо этого используйте деление.]

[Еще один ответ указывает, что вы также можете изматывать свой стек, хотя я ожидал бы другой ошибки. Стоит проверить, хотя.]

+0

Я не думаю, что это решит проблему – almanegra

+0

@almaneg: why?это бесконечный цикл –

+0

Re. проблема случайности, которая будет зависеть от того, какой PRNG был в использовании. –

Смежные вопросы