【问题标题】:strdup each line into the char ** (array)strdup 每一行到 char ** (array)
【发布时间】:2014-09-22 20:01:28
【问题描述】:

我不会将每一行添加到 char **结果中。我做了以下事情:

static char **alsa_get_device(void)
{
    int o;
    char **result;

    o = 0;
    for (elem = snd_mixer_first_elem(handle); elem; elem = snd_mixer_elem_next(elem)) {
        if (!snd_mixer_selem_is_active(elem))
            continue;
        if (!snd_mixer_selem_has_playback_volume(elem))
            continue;
        result[o] = strdup(snd_mixer_selem_get_name(elem));
        o++;

        result[o] = NULL;
    }

    return result;
}

并制作函数返回 GList:

GList *get_mixer_list(void)
{
    int i;
    char **array, *dev;
    GList *result = NULL;

    array = alsa_get_device();
    if (!array)
        return NULL;

    i = 0;  
    dev = array[i];
    while (dev) {
        char *text = g_strdup(dev);
        result = g_list_append(result, text);
        free(dev);
        dev = array[++i];
    }           
    free(array);

    return result;
}

但是当我使用这个崩溃时:result[o] = strdup(snd_mixer_selem_get_name(elem));

【问题讨论】:

  • 什么是elem?并且result 未初始化使用。
  • 您从未为result 分配空间——您未初始化地使用它。这是个坏消息。
  • 在编译器中启用警告...

标签: c arrays alsa


【解决方案1】:

以下是您的代码中的错误:

  • 如评论中所说result 未初始化使用
  • 你使用了free(array)而没有使用malloc()
  • 在这个片段中:

    char *text = g_strdup(dev);
    result = g_list_append(result, text);
    free(dev);
    dev = array[++i];
    

你应该用free(text)替换free(dev)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多