C代码停止运行

时间:2014-09-29 02:25:21

标签: c compiler-errors

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

第二次循环测试中有复制和粘贴错误:

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

应该是j而不是i

[另外,不相关但你不应该对%的结果使用模rand(),因为低位不像高位那样随机。改为使用师。]

[另一个答案指出你可能也在耗尽你的筹码,尽管我会期待一个不同的错误。值得一试。]