我是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();
}
答案 0 :(得分: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
所有这些行分配。
答案 1 :(得分:0)
您正在存储row
,一个局部变量。一旦其范围结束,该指针就不再有效:
for (int j = 0; j < 10; j++) {
int row[] = {i+j, i*j, i-j};
addRow(matrix, row);
}
您也必须为行数据动态分配内存。
答案 2 :(得分:0)
row是一个局部变量。一旦循环进行新迭代,数据就会被覆盖,循环退出后数据超出范围。 所以使用 int * row = malloc(NumOfRows * sizeof(int)); 然后排成员。