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