C代码停止运行

问题描述:

我有以下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

内存来容纳行

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

您的第二个循环测试中的复制和粘贴错误:

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