1

我将文件指针传递给函数(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;
4

5 回答 5

2

可能函数 insertNewNode 会覆盖内存

于 2013-01-25T19:43:52.230 回答
1

更喜欢strtol.atoi

正如@DavideBerra 建议的那样,注释掉对代码的调用insertNewNode并逐步执行代码以确认您可以对while循环进行多次迭代。

我不明白您如何使用m->matrixDimensions.columnsand初始化矩阵数组m->matrixDimensions.rows。您使用的是 C99 VLA 吗?

提高编译器的警告级别并确保零警告编译。

于 2013-01-25T20:22:45.360 回答
1

您不初始化新分配节点的 nextRow 和 nextColumn 字段。这样做至少可以避免一些麻烦。奇怪的是你没有得到 Segfault。

您还混合了数组和链表,如果您从文件中获得“溢出”值会发生什么?我觉得段错误离这里不远。要非常小心,您的代码显示了奇怪的概念混合!

正如其他人建议的那样,评论您的 insertNewNode 调用,看看您的循环是否执行良好。如果是,请使用调试器逐步运行您的程序。希望这有帮助,祝你好运 !

于 2013-01-25T20:34:15.577 回答
0

检查和访问之前的值row以及column这些matrix->rowArraymatrix->columnArray是否小于数组大小。

于 2013-01-25T19:48:08.353 回答
0

我的猜测是值行,列可能在您的矩阵之外,因此会覆盖内存。添加对您收到的值的检查,并确保您的矩阵足够大。请记住,数组在 C 中是零索引的。

于 2013-01-25T19:50:09.147 回答