指针变为空

时间:2013-01-25 19:41:40

标签: c memory fopen

我正在传递一个函数(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;

5 个答案:

答案 0 :(得分:2)

函数insertNewNode可能会覆盖内存

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

在访问rowcolumn之前检查matrix->rowArraymatrix->columnArray的值是否小于数组大小。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

首选strtol atoi

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

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

调整编译器的警告级别并确保零警告编译。