我正在使用 GLib 和 C 制作一个应用程序,其中我需要存储一个字符串列表(即 的列表char*
)。最初,我以为我会使用 GList 或 GArray,但后来我意识到字符串只是指针,因此 GPtrArray 可能最容易使用,所以我使用了它。我遇到的唯一问题是,char*
当通过 as 访问它时,我必须将值转换回 a g_ptr_array_index
,否则我只会得到一个gpointer
/ void*
。如果我不进行转换,我会得到以下错误:
src/main.c:769:18: error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘gpointer’ {aka ‘void *’} [-Werror=format=]
769 | printf("%s\n", g_ptr_array_index(setting_zero->key, 0));
| ~^
| |
| char *
| %p
但是,尽管我觉得它不对劲(我对编写 C 代码没有特别的经验),但如果我添加了强制类型转换,它似乎可以正常工作。
因此,我想问一下,GPtrArray
在 C 中用它来存储字符串数组是否正确?
不完全是。C 字符串是数组
char
,或者更准确地说,是以空字节结尾并存储在数组中的序列char
。指针是 C 语言中引用大多数字符串的方式。它们不是字符串本身。
GPtrArray
表示任意对象指针的数组。这非常适合指向字符串的指针。您总是会从 得到
gpointer
返回值g_ptr_array_index
。无论您何时需要不同类型的指针,都需要进行转换。在您可以依赖gpointer
成为 的别名的范围内void *
,在大多数情况下会自动执行所需的转换,但这些上下文不包括可变函数(如 )的可变参数printf
。您报告的错误通常是一个警告,因此您必须使用
-Werror
或其变体之一进行编译(您可能不知道)。最好的解决方案是插入强制类型转换。这样做没有坏处,并且它并没有说明 是否适合GPtrArray
您的目的。唯一的解决方法是使用特定于字符串和类型的数据结构char *
,这样就不需要首先执行转换。