0

我有以下代码:

#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 required\n");
        return 0;
    }

    FILE *input_file = fopen(argv[1], "r");
    char del = '\0';

    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 整数的输入文件运行此程序时,我blah在 main 中的函数调用中遇到分段错误。我也无法使用 gdb 收集有关分段错误的任何信息,它只是说:

0x0000000000400928 in blah (a=Cannot access memory at address 0x7ffffdbfe198) at blah.c

我在这里做错了什么?任何帮助将不胜感激。

4

2 回答 2

1

你 typedefsubband_t作为一个几 MB 的大型二维数组。这将需要几 MB 的堆栈内存。这是否有效是实施质量的问题。程序段#define MAXSAMPLES 10错误吗?那就是你的问题了。

请注意

 while (! feof(input_file)) { ... }

从来没有工作过,也永远不会工作,因为只有在输入操作命中 EOF后才会设置 EOF 标志。请参阅 comp.lang.c 常见问题解答。

于 2013-03-25T11:01:42.807 回答
1

你对 typedef 感到困惑:你做了:

typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES];
  • 编辑:

这里有一个类似问题的示例: 创建指向二维数组的指针

所以看起来typedef是正确的,它可能是在堆栈上分配了这么多内存,当你将MAXSAMPLES定义为10时它是否仍然存在段错误?也就像他说的那样,存在 feof 问题。正如我评论的那样,您的函数看起来接收 6 个参数,而您只发送 5..

于 2013-03-25T11:04:42.630 回答