1

我正在使用 glib 2.0 API。我正在读取一个 CSV 文件,并使用 g_strsplit 函数来获取逗号之间的数据。以下是我的代码:

gchar* record = get_record_from_file();
printf("Record: %s\n", record); <--- WORKS CORRECTLY
gchar** data = g_strsplit(record, ",", 6); <-- ERROR HERE
free(record);

当我使用 split 方法时,我得到一个错误。这是我的输出。

记录:2,0.4,2,0,1,10,

* 检测到 glibc * /path/to/my/project: free(): invalid next size (normal): 0x0000000001c06a00 ***

我试着用谷歌搜索错误。显然,从这个问题和答案来看,错误与记忆有关:

这意味着你有一个内存错误。您可能试图释放不是由 malloc 分配的指针(或删除不是由 new 创建的对象),或者您可能试图多次释放/删除这样的对象。您可能正在溢出缓冲区或以其他方式写入不应写入的内存,从而导致堆损坏。

是否正确调用了 g_strsplit?为什么我会收到此错误?

文件

string:要拆分的字符串。

delimiter :一个字符串,它指定分割字符串的位置。分隔符不包含在任何结果字符串中,除非达到 max_tokens。

max_tokens :将字符串拆分成的最大片段数。如果小于 1,则字符串被完全拆分。

返回:一个新分配的以 NULL 结尾的字符串数组。使用 g_strfreev() 释放它。

4

2 回答 2

2

You should call g_strsplit like so

gchar **data = g_strsplit (result, ",", 6);

The reason is because g_strsplit is expecting a NULL terminated string for delimiter and &delimiter gives the memory address of a single character with no NULL character afterwards so it writes over some memory

于 2013-03-17T12:31:19.417 回答
1

我弄清楚了问题所在。我收到了那个错误,因为我的缓冲区太小而无法容纳数据。我增加了它,错误消失了。

于 2013-03-17T13:48:32.067 回答