我有以下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;
}
答案 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()
,因为低位不像高位那样随机。改为使用师。]
[另一个答案指出你可能也在耗尽你的筹码,尽管我会期待一个不同的错误。值得一试。]