对于一个赋值,我必须为一个结构分配一个连续的内存块,但我首先尝试使用一个二维的int数组,然后看看我是否正确理解它。我们在书中有一个例子,它为指针数组(行)创建一个内存块,然后初始化cols并将指针指向它们。这个例子是:
int **CreateInt2D(size_t rows, size_t cols)
{
int **p, **p1, **end;
p = (int **)SafeMalloc(rows * sizeof(int *));
cols *= sizeof(int);
for (end = p + rows, p1 = p; p1 < end; ++p1)
*p1 = (int *)SafeMalloc(cols);
return(p);
}
void *SafeMalloc(size_t size)
{
void *vp;
if ((vp = malloc(size)) == NULL) {
fputs("Out of mem", stderr);
exit(EXIT_FAILURE);
}
return(vp);
}
我基本上需要做上面代码所做的事情,除了使它成为一个连续的内存块。约束是我只允许调用malloc一次,然后我必须使用指针数学来知道初始化指针的内容。所以我想我会用以下内容初始化足够的内存:
int *createInt2D(size_t rows, size_t cols)
{
malloc(rows * sizeof(int *) + (row + cols) * sizeof(int));
}
但这似乎不太正确,因为我认为我必须对从malloc返回的void *进行类型转换,但它是int和int *的组合。所以我不太确定我是否走在正确的轨道上。思考?
答案 0 :(得分:2)
如果你想要一个连续的数组,你应该malloc(rows * cols * sizeof(int))
。
然后你可以访问arr[x, y]
,如:
arr[x * cols + y]
答案 1 :(得分:1)
你走在正确的轨道上。 malloc返回的块保证正确地对齐int *或int;你也可以用它。类型转换不是一次性操作。
如果您要独占使用array[row, col]
寻址,则可以在不为行指针分配额外空间的情况下使用。如果您希望能够使用array[row]
获取int *
列列表,则必须在分配中为列指针添加空间。
希望这足以帮助你锻炼身体。
答案 2 :(得分:1)
malloc((row * cols) * sizeof(int));
它是行* cols,它是2D数组中的元素数,而不是row + cols。
答案 3 :(得分:0)
无需乘以int *
的大小。那只用于分配行的指针。行和列的总和也是如此。分配(rows * cols)* sizeof足以分配任何结构就足够了。