在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
}
答案 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指向的内存(除了使用自动分配的数组的第一次调用之外)。
最后,这和您的原始代码并没有真正交换数组。代码只是分配一个新数组来代替旧数组。但我认为这回答了你问题的实质。