【发布时间】:2011-11-08 05:49:46
【问题描述】:
在开始获取矩阵的缩减行梯形表的程序时,我将用于打印数组的代码转移到了它自己的函数中。一旦我这样做了,我就得到了一个段错误。但令我困惑的是,一个不相关的变量声明(在下面评论)解决了段错误。
#include <stdio.h>
int COLS = 3;
int ROWS = 3;
void PrintArray(int array[][COLS]);
int main (int argc, char**argv) {
int i, ii = 0;
FILE *file;
file = fopen(argv[1], "r");
int array[ROWS][COLS];
fscanf(file, "%d %d", &ROWS, &COLS);
while (!feof(file))
{
fscanf(file, "%d", &array[i][ii]);
ii++;
if (fgetc(file) == '\n') {
i++;
ii = 0;
}
}
int j = 0, k = 0; //This solved the segfault.
PrintArray(array);
printf("\n");
fclose(file);
return 0;
}
void PrintArray(int array[][COLS]) //The printing function
{
int j, k;
for (j = 0; j < ROWS; j++)
{
for (k = 0; k < COLS; k++)
{
printf("%d", array[j][k]);
}
printf("\n");
}
}
经过几个小时的调试,我最终发现这可能与 for 循环中变量的范围有关。
举例说明:
int COLS = 3;
int ROWS = 3;
int a; //declared globally
//main
for (a = 0; a < ROWS; a++) {
printf("for loop");
}
有效,但只要我在 main 中声明“a”:
int COLS = 3;
int ROWS = 3;
//main
int a; //declared in main
for (a = 0; a < ROWS; a++) {
printf("for loop");
}
它不起作用。
另外,如果我用数字替换全局变量,我仍然会得到一个段错误,直到我删除最初修复段错误的行!
void PrintArray(int array[][3]) //COLS
{
int j = 0, k = 0;
for (j = 0; j < 3; j++) //ROWS
{
for (k = 0; k < 3; k++) //COLS
{
printf("%d", array[j][k]);
}
printf("\n");
}
}
这似乎是我所能理解的问题,因此我们将不胜感激。
【问题讨论】:
-
您从文件中读取的 ROWS 和 COLS 的值是多少?
-
它们是文件中的前两个数字。正如 Eugene 指出的那样,ROWS 和 COLS 的值实际上并没有改变,我没有注意到这一点,因为我忘记测试 3 3 以外的值。