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;
}
内存来容纳行
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
哪里有一个问题,通常有不止一个...... – 2014-09-29 02:34:22
@R Sahu这不是记忆。我尝试'符号[10] [64]'并得到相同的错误。但是调试器指向符号[i] [j] = s [r];'。 – AboAmmar 2014-09-29 02:41:16
@AboAmmar按照MitchWheat的回答建议,您正在访问'symbol'数组的界限。您需要修复这两个问题以使您的代码正常工作。 – 2014-09-29 02:49:21
您的第二个循环测试中的复制和粘贴错误:
for (j=0; j<N; j++){
^
应该j
没有i
[另外,无关,但你不应该使用模%
对rand()
的结果,因为低位不像高位那样随机。改为使用除法。]
[另一个答案指出,你也可能会耗尽你的堆栈,尽管我会期待一个不同的错误。值得一试,虽然]
我不认为这会解决问题 – almanegra 2014-09-29 02:31:09
@almaneg:为什么?这是一个无限循环 – 2014-09-29 02:31:58
Re。随机性问题,这将取决于哪个PRNG正在使用 – 2014-09-29 02:32:00
你做了什么 - 如果有的话 - 试图找出这个问题? – 2014-09-29 02:28:50
你需要在某处分配内存 – almanegra 2014-09-29 02:31:45
这行是错误的:'复数(*符号)[n] [N] = malloc(n * sizeof *符号);'。更仔细地从R Sahu的回答中复制出来。你也到处都冒出了虚假的'*'。它应该是'symbol [i] [j]',而不是'* symbol [i] [j]',对于所有的飞行员来说都是一样的。 – 2014-09-29 02:58:51