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

Copy char array to another char array without memory leak

我有一个动态内存分配给 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?

此致

你没有剥离代码到MVCE,所以我无法测试是否还有其他问题。但由于 array1 已从堆中分配(通过 malloc/realloc),您可以 安全地将其地址传递给任何其他函数或 return 它。

因为当你写*array2 = array1时,你只是将指针数组array1的地址复制到array2指向的地址。

唯一的规则是你应该在 mixer_get_element 的调用者的某处释放它。

我不确定是否需要它,但我强烈建议您在 alsa_get_element 中将指针初始化为 NULL :

snd_mixer_elem_t *elem =  NULL;
char **array1 = NULL;

它们是在堆栈中创建的,优化版本可能不会将这些值初始化为 NULL。