Kyr*_*rol 5 c parsing valgrind strsep
我想解析一个字符串,我使用strsep函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[] = "Marco:Q:2F7PKC";
char *token1, *token2, *token3;
char *r = malloc(30);
strcpy(r, str);
token1 = strsep(&r, ":");
token2 = strsep(&r, ":");
token3 = strsep(&r, ":");
printf("tok1 = %s\n", token1);
printf("tok2 = %s\n", token2);
printf("tok3 = %s\n", token3);
free(r);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该函数完成了它的工作,但是如果我启动valgrind,分配的字符串char * r不会正确释放(肯定会丢失:1个块中的30个字节).
我想知道为什么以及是否有其他方法可以做同样的事情,也许没有呼叫strsep.
我打电话给valgrind valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./a.out
Fre*_*Foo 16
strsep覆盖其第一个(指针指向)参数的目标,因此您将丢失指向malloc'd缓冲区基础的指针.实际上,如果你确实在printf("%p\n", r);它之前放了一个free,你会发现你正在释放一个无效的空指针.
简单的解决方案是引入一个额外的变量来保持指针周围和free它完成时.习惯用法是
char *r = strdup("Marco:Q:3F7PKC");
// check for errors
char *tok = r, *end = r;
while (tok != NULL) {
strsep(&end, ":");
puts(tok);
tok = end;
}
free(r);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20146 次 |
| 最近记录: |