C / Glib,我是否正确地截断了这个gchar数组?

时间:2013-10-19 00:10:20

标签: c string free glib

我试图重构/修复一个函数,我是否正确地进行了截断?如果不是,通常应如何做?特别想知道潜在的泄漏。

void process_entry(GMenuTreeEntry *entry)
{
    char *name = g_strdup (gmenu_tree_entry_get_name(entry));
    char *exec = g_strdup (gmenu_tree_entry_get_exec(entry));
    int i;

    for (i = 0; i < strlen(exec) - 1; i++) {
        if (exec[i] == '%')
        {
            switch (exec[i+1]) {
                case 'f': case 'F':
                case 'u': case 'U':
                case 'd': case 'D':
                case 'n': case 'N':
                case 'i': case 'c': case 'k': case 'v': case 'm':
                    exec[i-1] = '\0';
                    i++;
                    break;
            }
        }
    }

    g_printf("<item label=\"%s\">\n", g_strjoinv("&amp;", g_strsplit(name,"&",0))),
    g_printf("<action name=\"Execute\"><command>%s</command></action>\n", exec),
    g_printf("</item>\n");

    g_free(name);
    g_free(exec);
}

这是针对某些GPL代码的,所以非常感谢您的帮助。我对C总的来说还是很新的,而且我很擅长全新。

1 个答案:

答案 0 :(得分:1)

gcharchar完全相同,所以无论你做什么,都适用于普通的C字符串。

当您在字符串上调用free()g_free()时,它不会计算strlen()以查找要释放的内存量;它释放了最初在该地址分配的大量内存。否则,你永远不会释放没有指定其分配内存长度的指针。因此截断字符串是安全的。