gpt4 book ai didi

c - 在 C 中的递归子程序中释放内存

转载 作者:行者123 更新时间:2023-12-04 04:42:39 26 4
gpt4 key购买 nike

我想问一个关于在 C 中释放内存的问题。我正在实现 mergeSort 函数如下:

合并子程序:

int* merge (int* array_left, unsigned int left_length, int* array_right, unsigned int right_length) {

unsigned int result_size = right_length + left_length;
int* result = malloc(result_size*sizeof(int));
int r = 0; // result index

// Iterate through all left and right array elements
int i = 0; // left index
int j = 0; // right index
while ( (i < left_length) && (j < right_length) ) {
if ( *(array_left+i) < *(array_right+j) ) {
*(result+r) = *(array_left+i);
i++;
} else {
*(result+r) = *(array_right+j);
j++;
}
r++;
}

// Fill the remaining elements to the result
if (i < left_length)
while (i < left_length) {
*(result+r) = *(array_left+i);
r++;
i++;
}

if (j < right_length)
while (j < right_length) {
*(result+r) = *(array_right+j);
r++;
j++;
}

return result;
}

归并排序:
   int* mergeSort(int* array, unsigned int length) {
// Base case
if (length <= 1)
return array;

// Middle element
unsigned int middle = length / 2;

int* array_right = mergeSort(array, middle);
int* array_left = mergeSort(&array[middle], length-middle);

// Result is merge from two shorted right and left array
int* result = merge(array_left, length-middle, array_right, middle);

return result;
}

该程序运行正常,但我没有从 malloc 调用中释放内存,事实上我无法弄清楚如何放置 free()。我试图释放 array_right 和 array_left 但我得到错误告诉我我只能释放由 malloc 直接分配的指针。

请帮忙!提前谢谢你们。

最佳答案

你需要添加

free(arrayLeft);
free(arrayRight);

以及 malloc 并复制数组,即使它的长度在 mergeSort 中为 1:
int* mergeSort(int* array, unsigned int length) {
// Base case
if (!length) return NULL;
if (length == 1) {
// Make a copy of a single-element array
int *tmp = malloc(sizeof(int));
*tmp = *array;
return tmp;
}
... // The rest of your code
}

这将确保 mergeSort 的调用者始终拥有它返回的数组,因此他必须在所有情况下释放它。

当您尝试它时它不起作用的原因是您没有制作琐碎数组的副本,这导致其中一些重复释放。

关于c - 在 C 中的递归子程序中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18669099/

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