1

我是 C 新手,我正在尝试使用结构和一些将更改结构的 int** 字段的方法来定义矩阵。矩阵应该是动态分配的,并且可以在它可以拥有的行数中调整大小。当我运行下面的程序并在 main 中打印出矩阵的值时,矩阵只有随机值,而不是插入到 genMatrix() 和 addRow() 中的值。我究竟做错了什么?非常感谢任何帮助。

我这样定义结构:

typedef struct matrix {
    int** matrix;
    int rows;
    int cols;
    int capacity;
} matrix;

然后有以下方法应该改变结构的字段:

matrix* genMatrix() {
    matrix* matrix = malloc(sizeof(matrix));

    initMatrix(matrix, 100, 3, 200);

    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            int row[] = {i+j, i*j, i-j};            
            addRow(matrix, row);
        }
    }

    return matrix;
}   

void initMatrix(matrix* matrix, int rows, int cols, int capacity) {
    matrix->matrix = malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        matrix->matrix[i] = malloc(cols * sizeof(int));
    }
    matrix->cols = cols;
    matrix->rows = rows;
    matrix->capacity = capacity;
}

void addRow(matrix* matrix, int* row) {
    if (matrix->rows == matrix->capacity) {
        matrix->capacity *= 2;
        matrix->matrix = realloc(matrix->matrix, matrix->capacity * sizeof(int*));
    }

    matrix->matrix[matrix->rows++] = row;
}

在 main 中,我调用函数 genMatrix,然后将结果打印出来,但会得到随机值,如 32691、-1240670624 等。

int main() {
    matrix* matrix = genMatrix();   
}
4

3 回答 3

1

当您尝试在此处添加一行时:

        int row[] = {i+j, i*j, i-j};            
        addRow(matrix, row);

您添加的数据是一个临时的局部变量。在下一次循环迭代中,它将被覆盖,然后当循环退出时,它将超出范围。

您需要为新的行数据分配一些内存,例如使用malloc

        int * row = malloc(3 * sizeof(int));
        row[0] = i+j;       
        row[1] = i*j;       
        row[2] = i-j;       
        addRow(matrix, row);

free完成矩阵后,不要忘记所有这些行分配。

于 2013-04-18T08:08:54.090 回答
0

row 是一个局部变量。一旦循环进行新的迭代,数据就会被覆盖,并且循环退出后,数据就会超出范围。所以使用 int * row = malloc(NumOfRows * sizeof(int)); 然后是行成员。

于 2013-04-18T08:18:53.507 回答
0

您正在存储row,一个局部变量。一旦它的作用域结束,这个指针就不再有效:

for (int j = 0; j < 10; j++) {
    int row[] = {i+j, i*j, i-j};            
    addRow(matrix, row);
}

您也必须为行数据动态分配内存。

于 2013-04-18T08:11:30.823 回答