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

标签 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 还是很陌生,而 glib 我真的是全新的。

最佳答案

gcharchar 完全相同,因此您在这里所做的任何操作也适用于常规 C 字符串。

当您在字符串上调用 free()g_free() 时,它不会计算 strlen() 来找出释放多少内存;它释放了最初在该地址分配的内存。否则,您永远无法释放未在某处指定其分配内存长度的指针。因此截断字符串是安全的。

关于C/Glib,我是否正确截断了这个 gchar 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460805/

相关文章:

c++ - 为内存中的位图声明缓冲区

c - 在 c 中将图像旋转 x 角度

c# - 如何创建一个包含数字数组和字符串数组的随机类

在带有 return + C 的方法中正确使用 free()

c - 'unary *' 的类型参数无效(有 'int' )。基本上我在指针和结构的逻辑上遇到了麻烦

java - 简单 HelloWorld 程序的 JNI : Getting java. lang.UnsatisfiedLinkError

更改数组中的元素值未正确反射(reflect)

python - 在Python3中高效地切片字符串

c - 为什么未释放的内存会导致泄漏?以及其他一些问题

c++ delete[] 二维数组导致堆损坏