【发布时间】:2014-05-18 07:46:35
【问题描述】:
我想掌握 C 中的内存管理。我已经开始使用 Valgrind。这是我要解决的第一个记忆问题。
重要变量:
#define BUF_SIZE 1024
char buffer[BUFSIZ];
char *parsed;
这是分词器:
char **tokenize(char *buffer) {
parsed = malloc(sizeof(buffer)); // #286
tokens = (char**)malloc(sizeof(buffer));
if (buffer[0] == '\n'){
printf("What do you expect? Enter sumething!\n");
exit(0);
}
strcpy(parsed, buffer); // #292
free(buffer);
for (i=0; i < 2; i++){
if (!(((tok = strsep(&parsed, delimeter)) != NULL) && (tokens[i] = tok)))
exit(0);
}
return tokens;
}
分词器用法:
while (fgets(buffer, BUFSIZ, stdin)) {
tokens = tokenize(buffer); // #303
Valgrind 回溯:
Invalid write of size 1
at 0x4C2BFFC: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x4014BF: tokenize (B_tree.c:292)
by 0x40156B: main (B_tree.c:303)
Address 0x51f2048 is 0 bytes after a block of size 8 alloc'd
at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x401472: tokenize (B_tree.c:286)
by 0x40156B: main (B_tree.c:303)
重要行有带有原始行号的 cmets,用于回溯。
缓冲区肯定大于传入的值。那里的常见问题是什么?如何解决?
【问题讨论】:
-
sizeof(buffer)==sizeof(char*). -
还有
tokens = (char**)malloc(sizeof(buffer));错误。和free(buffer);错了。
标签: c memory-management buffer valgrind fgets