我有以下代码:
#define MAXSAMPLES 1024
typedef int sample_t;
typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES];
void blah(sample_t a[][MAXSAMPLES], int u0, int v0, int u1, int v1) {
. . . .
}
int main(int argc, char *argv[]) {
sub_band_t in_data;
int k =0;
if (argc < 2) {
printf("nInput filename requiredn");
return 0;
}
FILE *input_file = fopen(argv[1], "r");
char del = ' ';
int i = 0, j = 0;
int cols = 0;
sample_t x;
while (! feof(input_file)) {
if (fscanf(input_file, "%d%c", &x, &del) != 2) {
i--;
break;
}
in_data[i][j] = x;
if ( del == 'n') {
i++;
j =0;
continue;
}
j++;
cols = j > cols ? j : cols;
x = 0;
}
blah(in_data, 0, 0, i, cols);
}
当我用带有10*10整数的输入文件运行此程序时,我在main中的blah
函数调用中得到分段错误。我也无法使用gdb收集有关分段故障的任何信息,它只是说:
0x0000000000400928 in blah (a=Cannot access memory at address 0x7ffffdbfe198) at blah.c
我在这里做错了什么?如有任何帮助,不胜感激。
您将subband_t
类型定义为几个MB的大型二维数组。这将需要几个MB的堆栈内存。这是否有效取决于实施的质量。#define MAXSAMPLES 10
的程序段故障吗?那就是你的问题了。
注意
while (! feof(input_file)) { ... }
从来没有工作过,也永远不会工作,因为EOF标志只在输入操作命中EOF之后才设置。参考comp.lang.c FAQ
你搞混了typedefs:你做:
typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES];
- 编辑:
这里有一个类似问题的例子:创建一个指向二维数组
的指针所以看起来像typedef是正确的,它可能是在堆栈上分配了这么多内存,当你定义MAXSAMPLES为10时,它仍然存在seg错误吗?就像他说的,还有脚的问题。正如我所评论的,你的函数看起来接收6个参数,你只发送5个…