【问题标题】:Swap the pointers of two arrays in a function [duplicate]在函数中交换两个数组的指针[重复]
【发布时间】:2014-05-28 10:30:06
【问题描述】:

我正在编写一个没有复制部分的合并排序到一个额外的临时数组中。为此,我创建了一个辅助数组aux

int * aux
aux = (int *) calloc(n, sizeof(int));

其中n 是数组的大小。在函数合并中,我想在最后交换两个数组,方法是使用它们的指针继续我的算法。但是如果我交换指针,并将它们打印到控制台,我得到了奇怪的东西:

在方法本身中,指针被交换。但是,如果我在我的方法之后检查,回到我的主目录,指针就不会再交换了。 我的合并方法的调用:

merge(a, lo, mid, hi, aux);

a 是我的主数组,aux 是辅助数组,lomidhi 是整数。

原型:

void merge(int *a, int lo, int mid, int hi, int *aux);

我试着像这样交换它们:

int temp;
temp = a;
a = aux;
aux = temp;

你能帮我解决这个问题吗?

提前致谢!

【问题讨论】:

  • 本质上是duplicate of this
  • 我不同意重复的问题,并提名这个问题重新开放。这是一个非常集中的问题,也是一个有用的独立示例,与“重复”不同。
  • 我也投票重新开放,因为重复的答案并不能直接回答这个问题。 Kerrek SB 的链接答案非常好,但那里的问题不如这个。

标签: c arrays function pointers swap


【解决方案1】:

发生错误是因为指针是按值传递的。

将它们改为指向指针的指针:

void merge(int **a, int lo, int mid, int hi, int **aux);

像这样交换:

int *temp;
temp = *a;
*a = *aux;
*aux = temp;

merge 应该这样调用:

merge(&a, lo, mid, hi, &aux);

【讨论】:

  • 这是一道 C 题。没有参考。
  • 谢谢,我忘了。
  • 您好,谢谢您的回复。现在,我遇到了以下问题:我可以访问 *a[0],但无法在合并函数中访问 *a[1]... 我对 C 来说太笨了吗? :(
  • 您可以或者使用临时本地指针 int * pa = *a 并使用 pa,如之前的 apa[1]使用(*a)[1]
  • 终于解决了,非常感谢!!!
【解决方案2】:

我可以发现您的方法存在 2 个不同的问题:

1) 为什么要使用 int 临时变量来交换 int* 指针?如果 sizeof(int) != sizeof(int*),这可能会导致问题,例如 64 位系统。为什么不使用 int* 临时变量?

2) 你的指针在:

void merge(int *a, int lo, int mid, int hi, int *aux);

是按值传递的,这意味着您在函数中对指针值所做的任何更改都不会在函数外部可见。您应该使用以下方法之一:

void merge(int **a, int lo, int mid, int hi, int *aux);

或:

void merge(int *& a, int lo, int mid, int hi, int *aux);

如果你在 C++ 世界中。

另一件事:将 aux 传递给合并函数可能有些多余,因为您可以很好地在内部分配和释放它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2011-02-14
    • 2018-08-24
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多