交换数组引用C.

时间:2013-12-15 22:44:39

标签: c arrays function pointers swap

在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
}

1 个答案:

答案 0 :(得分: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指向的内存(除了使用自动分配的数组的第一次调用之外)。

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