结构中的字段采用随机值

时间:2013-04-18 08:05:42

标签: c structure

我是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();   
}

3 个答案:

答案 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)); 然后排成员。