2013-03-17 31 views
1

我正在使用glib 2.0 API。我正在读取CSV文件,并使用g_strsplit函数在逗号之间获取数据。以下是我的代码: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的检测* /路径/到/我/项目:免费():无效的下一个大小(正常): 0x0000000001c06a00 ***

我试着用google搜索错误。显然,从this问题和答案,错误与内存有关:

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

被调用的g_strsplit是否正确?为什么我得到这个错误?

Doc

字符串:一个字符串分割。

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

max_tokens:将字符串拆分为的最大数量。如果这个 小于1,则字符串被完全分割。

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

回答

1

我想出了什么问题。我得到了那个错误,因为我的缓冲区的大小太小而不能保存数据。我增加了它,错误消失了。

+0

很高兴听到。您发布的代码中没有任何其他显而易见的内容。使用像valgrind这样的工具可以帮助在将来发现像这样的内存问题 – iain 2013-03-17 13:50:40

+0

感谢@iain为您提供的所有帮助。欣赏它:) – Goaler444 2013-03-17 13:51:54

2

你应该叫g_strsplit像这样

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

的原因是因为g_strsplit期待一个NULL结尾的字符串为delimiter&delimiter给出了一个单个字符没有NULL字符的内存地址事后所以写超过一些内存

+0

虽然这是一个错误,并感谢您指出它,错误仍然存​​在= S – Goaler444 2013-03-17 12:36:39

+0

现在你有一个免费的错误 - 记录malloc'd? – suspectus 2013-03-17 12:38:48

+0

在这种情况下,你的“记录”是如何分配的?使用malloc或g_malloc?或者它实际上是一个不应该被释放的常量字符串? – iain 2013-03-17 12:38:53

相关问题