gpt4 book ai didi

c - 连续二维数组的重新分配

转载 作者:太空宇宙 更新时间:2023-11-04 03:05:56 26 4
gpt4 key购买 nike

我正在使用 Shawn Chin 在此处发布的方法生成连续的二维数组。[1][2]效果很好。

简要摘自他的帖子:

char** allocate2Dchar(int count_x, int count_y) {
int i;

# allocate space for actual data
char *data = malloc(sizeof(char) * count_x * count_y);

# create array or pointers to first elem in each 2D row
char **ptr_array = malloc(sizeof(char*) * count_x);
for (i = 0; i < count_x; i++) {
ptr_array[i] = data + (i*count_y);
}
return ptr_array;
}

以及以下免费功能:

void free2Dchar(char** ptr_array) {
if (!ptr_array) return;
if (ptr_array[0]) free(ptr_array[0]);
free(ptr_array);
}

虽然我只对在保持连续性的同时重新分配行数感兴趣,但我并不清楚如何在任一维度上创建等效的重新分配函数。增加列数会很有趣,但可能很难理解。除了说“这很难!”之外,我没有在任何地方找到任何关于这个问题的直接讨论。[2]

当然这可以通过一种可怕的暴力方法来实现,将数据复制到一个新的一维数组(上面的数据)进行存储,重新分配一维数组,然后释放并重新生成指向该行的指针(ptr_array)新尺寸的元素。然而,这对于行修改来说非常慢,因为复制数据至少需要两倍的内存需求,这对于更改列数来说确实非常糟糕。

这是上述更改行数方法的示例(更改列数无法正常工作,因为指针的偏移量对于数据而言是错误的)。我还没有完全测试过这个,但你明白了......

double **
reallocate_double_array (double **ptr_array, int count_row_old, int count_row_new, int count_col)
{
int i;
int old_size = count_row_old * count_col;
int new_size = count_row_new * count_col;

double *data = malloc (old_size * sizeof (double));
memcpy (&data[0], &ptr_array[0][0], old_size * sizeof (double));
data = realloc (data, new_size * sizeof (double));

free (ptr_array[0]);
free (ptr_array);

ptr_array = malloc (count_row_new, sizeof (double *));

for (i = 0; i < count_row_new; i++)
ptr_array[i] = data + (i * count_col);

return ptr_array;
}

另外,这种方法需要你知道之前的尺寸,这很讨厌!

非常感谢任何想法。

[1] How can I allocate a 2D array using double pointers?

[2] http://www.eng.cam.ac.uk/help/tpl/languages/C/teaching_C/node52.html

最佳答案

第一个 malloc 和 memcpy 是不必要的,因为您可以轻松访问位于 ptr_array[0] 的原始数据数组。您不需要知道旧的大小,因为 realloc 应该记忆它在该地址分配了多少并移动正确的数据量。

这样的事情应该可行。

double **
reallocate_double_array (double **ptr_array, int count_row_new, int count_col)
{
int i;
int new_size = count_row_new * count_col;

double *data = ptr_array[0];
data = realloc (data, new_size * sizeof (double));

free (ptr_array);

ptr_array = calloc (count_row_new, sizeof (double *));

for (i = 0; i < count_row_new; i++)
ptr_array[i] = data + (i * count_col);

return ptr_array;
}

关于c - 连续二维数组的重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5196318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com