gpt4 book ai didi

c - 交换数组引用 C

转载 作者:行者123 更新时间:2023-11-30 15:41:10 25 4
gpt4 key购买 nike

在 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分配给新分配的内存。这是行不通的,因为 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 指向的内存(除了使用自动分配数组的第一次调用)。

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

关于c - 交换数组引用 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20600835/

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