【问题标题】:swapping array references C交换数组引用 C
【发布时间】:2013-12-15 22:44:39
【问题描述】:

在 C 中交换数组的最佳做法是什么?

我得到了以下用例:

void func1 () {
    uint32_t a[2] = {0x00000001,0x40000000};
    uint32_t t = 2;
    do_some_magic(&t, a); 
    work_with_modefied(t,a);
}

void do_some_magic(uint_32_t *t,*a){
    //while being a magician 
    uint32_t *out;
    out = (uint32_t *) malloc((*t+1)*4);
    //modify a[i] and store in out[i];
    //some other work
    //the tricky part
    *t++;        // works excellent
   // a = out      wouldn't work
   // *a = *out    wouldn't work
}

【问题讨论】:

  • 很难说你到底想做什么。你能澄清一下你的问题吗?
  • 它是一个不能被重写的常量对象数组。它将替换一个指向此类目的的指针。
  • 如果您期望 a[1] 具有 out[1] 的值,它不会。 *a 等价于 a[0] 而 *out 等价于 o out[0]。最终结果是 a[0] 获得了 out[0] 的值,并且 a[1] 被保留为它在步骤 *a = *out; 之前的任何值
  • 数组不可赋值。就是这样。

标签: c arrays function pointers swap


【解决方案1】:

您正在尝试做的是分配a 指向新分配的内存,从我收集。这不起作用,因为a 是一个数组,而不是一个指针。为了实现您想要的,您需要存储和修改指向数组的指针。您可以通过两种方式实现交换。对于两者,func1 将是:

void func1 () {
    uint32_t t = 2;
    uint32_t a[2] = {0x00000001,0x40000000};
    uint32_t * b = a;
    b = do_some_magic(&t); 
    work_with_modified(t,b);
}

uint32_t * do_some_magic(uint32_t *t){
    *t++;
    return malloc((*t) * sizeof(uint32_t));
}

或者:

void func1 () {
    uint32_t t = 2;
    uint32_t a[2] = {0x00000001,0x40000000};
    uint32_t * b = a;
    do_some_magic(&t, &b); 
    work_with_modified(t,b);
}

void do_some_magic(uint32_t *t, uint32_t **b){
    *t++;
    *b = malloc((*t) * sizeof(uint32_t));
}

第二个更接近您的原始代码。当然,与原始示例一样,此处忽略了错误检查。您还需要注意 do_some_magic 已在堆上分配内存这一事实。稍后需要释放此内存。如果多次调用 do_some_magic,则需要在每次后续调用之前释放 b 指向的内存(第一次调用使用自动分配的数组除外)。

最后,这和您的原始代码并没有真正交换数组。该代码只是分配一个新数组来代替旧数组。但我认为这回答了你问题的本质。

【讨论】:

    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多