尝试使用此函数初始化动态矩阵时出现错误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);
哪里有错误?
答案 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));
,但这是一个灾难的处方,可能会破坏指针算术。
在编译时模拟n
和m
未知的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;在一大块内存中混合指针和数据的索引方案只是一个坏主意。