我有一个函数,动态内存分配给char数组:
static char **alsa_get_element(const char *card)
{
snd_mixer_elem_t *elem;
char **array1;
int n = 0;
elem = snd_mixer_first_elem(handle);
while (elem != NULL)
{
if (snd_mixer_selem_has_playback_volume(elem) {
char **tmp;
tmp = (char **) realloc(array1, sizeof(char *) * (n + 1));
if (tmp == NULL)
break;
array1 = tmp;
array1[n++] = strdup(snd_mixer_selem_get_name(elem));
}
elem = snd_mixer_elem_next(elem);
}
if (array1 == (char **) 0)
return NULL;
array1 = (char **) realloc(array1, sizeof(char *) * (n + 1));
array1[n] = NULL;
return array1;
}
我想将返回的数组从上一个函数移动到另一个没有资源泄漏的数组。
int mixer_get_element(const char *card, char ***array2)
{
int result = 0;
char **array1 = NULL;
array1 = alsa_get_element(card);
if (array1 != NULL) {
*array2 = array1 /* ?????????????? */
result = 1;
}
return result;
}
如何将array1的值复制到array2?我可以这样做:
*array2 = array1?
此致
答案 0 :(得分:0)
你没有剥离代码到MVCE,所以我无法测试是否还有其他问题。但是,由于array1
已从堆中分配(通过malloc / realloc),您可以
安全地将其地址传递给任何其他函数或将其返回。
因为当您编写*array2 = array1
时,只需将指针数组array1
的地址复制到array2
指向的地址。
唯一的规则是你应该在mixer_get_element
的来电者的某个地方释放它。
我不确定是否需要它,但我强烈建议您在alsa_get_element
中初始化指向NULL的指针:
snd_mixer_elem_t *elem = NULL;
char **array1 = NULL;
它们是在堆栈中创建的,优化版本可能不会将这些值初始化为NULL。