C代码停止运行

标签 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;
}

知道出了什么问题吗?

编辑:

现在,经过这些有值(value)的讨论,我可以将所有内容放在一起。这是包含计时和内存分配以及所有内容的工作代码:

#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;
}

最佳答案

保存该行声明的变量所需的内存

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

关于C代码停止运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091723/

相关文章:

c++ - extern "C"extern 变量在 C++ 程序中作为类变量寻求..如何声明它?

c - 如何对两个 32Q16 定点整数进行除法?

c - 如何在gcc中编译带有线程的C程序?

C - 无法读取用户整数输入

c - C中返回状态的初始值应该是多少?

c++ - VSCode C++编译错误: How to link an additional library (*.lib)?

java - 如何使用构造函数来打印每本书的主题,颜色和页面?

android - ffmpeg 为 Android 编译

java - 我对 Java 很陌生,这是我在类里面的第二课。可以使用任何帮助

c++ - 如何为相同的预处理程序变量编译C++