动态矩阵初始化错误

时间:2018-02-11 21:15:27

标签: c

尝试使用此函数初始化动态矩阵时出现错误assignment makes pointer from integer without a cast

int** allocate_matrix_solid(int n, int m)
{
    int **data = malloc(n * sizeof(int*) +n * m * sizeof(int));
    if (!data)
    return NULL;
    for (int i = 0; i < n; i++)
        data[i] = (int*)((char*) data + n * sizeof(int*) + i * m * sizeof(int));
    return data;
}


int** data = allocate_matrix_solid(2,2);

哪里有错误?

1 个答案:

答案 0 :(得分:2)

您不能以这种方式分配和模拟2D阵列(a.k.a矩阵)并让它做任何事情,但在32位和64位机器之间是100%不可移植的。为什么呢?

使用int **data = malloc(n * sizeof(int*) +n * m * sizeof(int));,您可以分配n-pointers + n * m integers,有效地在32位框上分配n + n * m个指针,在64位框上有n + (n * m)/2个指针。虽然您正在尝试索引data[i] = (int*)((char*) data + n * sizeof(int*) + i * m * sizeof(int));,但这是一个灾难的处方,可能会破坏指针算术。

在编译时模拟nm未知的2D数组是一个两步过程。首先,为n-pointers分配/验证存储,然后为m-integers分配/验证存储,将每个新块中的起始地址分配给data[i]。如果m是常量,那么您可以使用指向数组的类型[] 进行分配,并使用n * m * sizeof (type)立即分配,但是您没有int (*data)[2]您有int **data这两种根本不同的类型需要两种不同的分配方法。

如果要模拟2D数组(矩阵)并为指针和数据分配存储空间,您将执行以下操作:

#include <stdio.h>
#include <stdlib.h>

#define NROW 2
#define NCOL 2

int **allocate_matrix_solid (int n, int m)
{
    int **data = malloc (n * sizeof *data);    /* allocate n pointers */
    if (!data)
        return NULL;
    for (int i = 0; i < n; i++) {
        data[i] = calloc (m, sizeof *data[i]); /* allocate m integers */
        if (!data[i])         /* calloc used to initilize memory zero */
            return NULL;
    }
    return data;
}

int main (void) {

    int **data = allocate_matrix_solid (NROW, NCOL);
    if (!data) {
        fprintf (stderr, "error: allocate_matrix_solid failed.\n");
        return 1;
    }
    for (int i = 0; i < NROW; i++) {    /* output matrix */
        for (int j = 0; j < NCOL; j++)
            printf (" %2d", data[i][j]);
        free (data[i]);                 /* free integers */
        putchar ('\n');
    }
    free (data);                        /* free pointers */
    return 0;
}

示例使用/输出

$ ./bin/allocmatrix
  0  0
  0  0

仔细看看,如果您有其他问题,请告诉我。通常情况下,“自己动手”#34;在一大块内存中混合指针和数据的索引方案只是一个坏主意。