gpt4 book ai didi

c - 分散二维数组到连续二维数组的转换(C语言)

转载 作者:行者123 更新时间:2023-11-30 17:44:32 24 4
gpt4 key购买 nike

我正在尝试在 C 中创建一个通用函数,它接受任何类型的二维数组并将其复制到连续的内存块中。 (我需要这个函数来对我的复杂数据类型进行 MPI 聚合操作)。

假设我有以下整数数组

int n = 5;
int m = 6;

int** int_array = (int**) malloc(n* sizeof(int*));

for (int i = 0; i < n; i++ )
int_array[i] = (int *) malloc(m * sizeof(int) );

在这种类型的内存分配中,原则上不能希望使用以下指针算术来访问 int_array 的第 i,j 个条目

int value = (*lcc)[i*m+j];

因此,我实现了一个函数,该函数基本上分配一个新的内存块,并对 int_array 的条目进行整齐的排序,以便上述索引应该起作用。

void linearize(char*** array, int n, int m,unsigned int size_bytes){


char* newarray = (char*)malloc(m*n*size_bytes);

//copy array!
for (int i = 0;i<n;i++)
for(int j = 0;j<m*size_bytes;j++)
{
newarray[i*m*size_bytes+j] = (*array)[i][j];
}

//swap pointers and free old memory!
for (int i = 0;i<n;i++)
{
char * temp = (*array)[i];
(*array)[i] = newarray + i*m*size_bytes ;
free(temp);
}

}

我想让上面的函数能够处理任何类型的数组类型,因此我使用 char 指针来逐字节执行操作。我测试了该函数,到目前为止它可以工作,但我不确定内存释放。

free(temp) 是否释放 int_array[i] 指向的整个内存,即可从 int_array[i] 访问的 m*sizeof(int) 字节,还是仅释放前 m 字节(因为它认为我们的数组是类型为 char 而不是 in) ?或者简单地说,“线性化函数是否会导致内存泄漏?”

提前谢谢您!

*编辑*

按照 Nicolas Barbey 的建议,我运行了 valgrind 检查内存泄漏,但没有发现任何内存泄漏。

总结一下我发现难以理解程序行为的要点是:

在线性化函数中,以下代码是否会导致内存泄漏:

char * temp = (*array)[i];
(*array)[i] = newarray + i*m*size_bytes ;
free(temp);

不!不知何故,gnu 编译器足够聪明,可以知道“temp”指向要释放的字节数。最初我担心如果我 array[i] 是 int 类型的指针,例如,它指向一个内存位置,例如 5 ints = 5*4 字节,则 free(temp) 是将仅释放该内存的前五个字节。

另一点是:如何释放已经线性化的数组?也就是说,如果您有:

// first initialize the array.

int** array = (int**)malloc(5*sizeof(int*);
for(int i = 0; i< 5;i++)
array[i] = ( int* ) malloc(5*sizeof(int));

//now a call to linearize
linearize(&array,5,5,sizeof(int));

... do some work with array ....

// now time to free array
free(array[0]);
free(array);
//suffices to free all memory pointed to by array[i] and as well as the memory allocated
// for the pointers.

感谢您的讨论和建议。

最佳答案

每次 malloc() 调用时,您需要精确调用一次 free() 以避免内存泄漏。这意味着在您的情况下,int_array被传递给线性化函数分配除int_array分配之外的内存块,因此您需要循环int_array[i] 释放您遍历的每个 int*,然后释放 int_array 本身。此外,您还需要释放在线性化函数中创建的 block 。

关于c - 分散二维数组到连续二维数组的转换(C语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19951190/

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