gpt4 book ai didi

将 char 数组复制到另一个 char 数组而不发生内存泄漏

转载 作者:行者123 更新时间:2023-11-30 19:44:39 25 4
gpt4 key购买 nike

我有一个动态内存分配到字符数组的函数:

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?

问候

最佳答案

您没有将代码精简为 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。

关于将 char 数组复制到另一个 char 数组而不发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27765713/

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