我正在传递一个函数(A)的文件指针,然后打开文件,读取while循环中的一行(对于文件中的每一行),并使用这些值调用另一个函数(B)。问题是在运行函数B一次之后,文件指针变为NULL并且我不确定原因。
void readMatrixData(matrix *matrix, FILE *fileInput)
{
char buffer[30];
while(fgets(buffer, 30, fileInput) != NULL) {
char *splitString = strtok(buffer, ",");
int row = atoi(splitString);
splitString = strtok(NULL, ",");
int column = atoi(splitString);
splitString = strtok(NULL, ",");
int value = atoi(splitString);
insertNewNode(&matrix->rowArray[row], &matrix->columnArray[column], value, row, column);
}
}
我在调用函数A之前检查fopen是否返回NULL,但事实并非如此。我还在while循环上设置了一个断点,第一次命中时,fileInput分配了一些内存。但是,在第二个循环中,fileInput变为NULL,我不确定原因。
编辑:
这是insertNewNode函数:
void insertNewNode(node **rowHead, node **columnHead, int value, int row, int column) {
//Get to the correct position in the column linked list
if (*columnHead == NULL) {
*columnHead = malloc(sizeof(node));
} else {
while((*columnHead)->nextColumn != NULL && (*columnHead)->nextColumn->row < row)
*columnHead = (*columnHead)->nextColumn;
}
//Get to the correct position in the row linked list.
if (*rowHead == NULL) {
*rowHead = malloc(sizeof(node));
} else {
while((*rowHead)->nextRow != NULL && ((*rowHead)->nextRow->column < column))
*rowHead = (*rowHead)->nextRow;
}
node *newNode = malloc(sizeof(node));
newNode->column = column;
newNode->row = row;
newNode->value = value;
(*columnHead)->nextColumn = newNode;
(*rowHead)->nextRow = newNode;
}
涉及的结构是:
typedef struct matrix {
node **rowArray;
node **columnArray;
Size matrixDimensions;
} matrix;
typedef struct node {
int value;
int row;
int column;
struct node *nextColumn;
struct node *nextRow;
} node;
我用:
初始化矩阵数组node *columns[m->matrixDimensions.columns];
node *rows[m->matrixDimensions.rows];
for (int i=0; i< m->matrixDimensions.columns; i++)
{
columns[i] = NULL;
}
for (int i=0; i < m->matrixDimensions.rows; i++)
{
rows[i] = NULL;
}
m->columnArray = columns;
m->rowArray = rows;
答案 0 :(得分:2)
函数insertNewNode可能会覆盖内存
答案 1 :(得分:1)
您不初始化新分配节点的nextRow和nextColumn字段。这样做可以防止您至少遇到一些麻烦。很奇怪,你没有得到Segfault。
您还在混合数组和链接列表,如果您从文件中获得“溢出”值,会发生什么?我觉得segfault离这里不远。要非常小心,你的代码会显示混乱的概念!
正如其他人建议你的那样,注释你的insertNewNode调用,看看你的循环是否运行良好。如果是,请使用调试器逐步运行程序。希望这有帮助,祝你好运!
答案 2 :(得分:0)
在访问row
和column
之前检查matrix->rowArray
和matrix->columnArray
的值是否小于数组大小。
答案 3 :(得分:0)
我的猜测是值行,列可能在矩阵之外,因此会覆盖内存。添加对您收到的值的检查,并确保您的矩阵足够大。请记住,数组在C中为零索引。
答案 4 :(得分:0)
首选strtol
atoi
。
正如@DavideBerra建议的那样,注释掉对insertNewNode
的调用并逐步执行代码以确认您可以对while
循环进行多次迭代。
我不明白你是如何使用m->matrixDimensions.columns
和m->matrixDimensions.rows
初始化矩阵数组的。您使用的是C99 VLA吗?
调整编译器的警告级别并确保零警告编译。