为什么我得到 realloc() 无效的旧大小

Why I get realloc() invalid old size?

本文关键字:无效 realloc 为什么      更新时间:2023-10-16

我正在尝试管理 4D 动态分配的数组。else 语句中的代码给了我错误。如果我不包含 else 语句,代码就会正确,但这是一个很好的做法吗?

int**** datind = (int****) malloc(nRow * sizeof(int***));
for (size_t i = 0; i < nRow; i++) {
    datind[i] = (int***) malloc(nCol * sizeof(int**));
}
for (size_t i = 0; i < nCol; i++) {
    for (size_t j = 0; j < nRow; j++) {
        datind[j][i] = (int**) malloc(1 * sizeof(int*));
    }
}
while ( fscanf(fp1, "%d %*c %d %*c %zu", &row, &col, &n_value) != EOF ) {
    if (n_value > 0) {
       datind[row-1][col-1] = (int**) realloc(datind[row-1][col-1], n_value * sizeof(int*));
       for (size_t i = 0; i < n_value; i++) {
           datind[row-1][col-1][i] = (int*) realloc(datind[row-1][col-1][i], 6 * sizeof(int));
           for (size_t j = 0; j < 6; j++) {
               fscanf(fp1,"%d%*c", &datind[row-1][col-1][i][j] );
           }
    } else {
       datind[row-1][col-1][0] = (int*) realloc(datind[row-1][col-1][0], 1 * sizeof(int));
       datind[row-1][col-1][0][0] = -1;
    }
}

3D 数组的类似代码,即以 int** 开头,效果很好。

解决了!好的,这有效。我在注释中包含提示以提高代码质量。无需检查行和列是否等于 0,因为我知道它们可以从 1 到 197。 谢谢。

int **datind[(2*nx-1)][(2*ny-1)];
while ( fscanf(fp1, "%d %*c %d %*c %zu", &row, &col, &n_value) != EOF ) {
    if (n_value > 0) {
        datind[row-1][col-1] = (int**) malloc(n_value * sizeof(*datind));
        if (datind[row-1][col-1] == NULL) {
            printf("Memory allocation failed.n");
            return EXIT_FAILURE;
        }
        for (size_t i = 0; i < n_value; i++) {
            datind[row-1][col-1][i] = (int*) malloc(6 * sizeof(*datind[row-1][col-1]));
            if (datind[row-1][col-1][i] == NULL) {
                printf("Memory allocation failed.n");
                return EXIT_FAILURE;
            }
            for (size_t j = 0; j < 6; j++) {
                fscanf(fp1,"%d%*c", &datind[row-1][col-1][i][j] );
            }
        }
    } else {
        datind[row-1][col-1] = NULL;
    }
}