gpt4 book ai didi

c - 合并排序的维基百科 C 迭代版本中的 if 语句是什么意思?

转载 作者:行者123 更新时间:2023-12-05 00:10:02 25 4
gpt4 key购买 nike

我在维基百科中发现了合并排序的C版本,例如:

int min(int x, int y) {
return x < y ? x : y;
}
void merge_sort(int arr[], int len) {
int *a = arr;
int *b = (int *) malloc(len * sizeof(int));
int seg, start;
for (seg = 1; seg < len; seg += seg) {
for (start = 0; start < len; start += seg * 2) {
int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
int k = low;
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
while (start1 < end1 && start2 < end2)
b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
while (start1 < end1)
b[k++] = a[start1++];
while (start2 < end2)
b[k++] = a[start2++];
}
int *temp = a;
a = b;
b = temp;
}
if (a != arr) {
int i;
for (i = 0; i < len; i++)
b[i] = a[i];
b = a;
}
free(b);
}

我不知道为什么会有 if声明,是什么意思?
    if (a != arr) {
int i;
for (i = 0; i < len; i++)
b[i] = a[i];
b = a;
}

我认为 b将要被释放,为什么要操作 b ?为什么不只是 free(b) ?

最佳答案

在这个算法中,你分配了一些内存

int *b = (int *) malloc(len * sizeof(int));

必须在算法结束时释放此内存(否则会出现内存泄漏)。
然而,在第一个 for循环切换 ab :
int *temp = a;
a = b;
b = temp;

由于我们不知道算法中是否出现了奇数步,因此您不知道哪个变量指向开头分配的内存地址。
最后这个 if允许确定哪个变量包含已分配内存的地址。请记住,当您写 free(b) ,你没有释放变量 b这是一个指针(即大小取决于您的系统架构的变量,32 位系统中 4 个字节,64 位系统中 8 个字节,...),您在 b 指向的地址处释放内存.

所以,在 if之前,你有两种情况,
  • a具有分配内存的地址和b等于 arr
  • a等于 arrb具有分配内存的地址
  • 关于c - 合并排序的维基百科 C 迭代版本中的 if 语句是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58763130/

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