【发布时间】:2021-11-23 18:54:03
【问题描述】:
我这里有这段代码,用于标记字符串。此行检查字符串是否有引号并返回不带引号的字符串。如果我从用户那里得到一些东西,例如Hello "nice" day,它将返回hello nice day:
char* str = take_quotes(line, stderr);
take_quotes 函数正在分配空间,所以我需要在我的 tokenize 函数中释放空间。
我认为在我使用这条线之后,我可以在归还我的令牌之前释放空间,但是当我这样做时,我会丢失我的令牌中的任何东西。我应该如何释放从take_quotes返回的空间?
char** tokenize(char* line){
if(line == NULL)
return NULL;
char* str = take_quotes(line, stderr); //free space
char **tokens = malloc( sizeof( char * ) );
*tokens = NULL;
size_t n = 1;
const char *delim = " \t \n";
char *p = strtok( str, delim );
int success = p != NULL;
while ( success )
{
char **tmp = realloc( tokens, ( n + 1 ) * sizeof( char * ) );
if ( tmp == NULL )
{
free( tokens );
tokens = NULL;
success = 0;
}
else
{
tokens = tmp;
tokens[n - 1] = p;
tokens[n] = NULL;
++n;
p = strtok( NULL, delim );
success = p != NULL;
}
}
free(str);
str = NULL;
return tokens;
}
当我换行时
tokens[n - 1] = p;
到
tokens[n - 1] = strdup(p);
我在 Valgrind 中遇到了很多错误
==8175== LEAK SUMMARY:
==8175== definitely lost: 12 bytes in 3 blocks
==8175== indirectly lost: 0 bytes in 0 blocks
==8175== possibly lost: 6 bytes in 1 blocks
==8175== still reachable: 0 bytes in 0 blocks
==8175== suppressed: 0 bytes in 0 blocks
==8175==
==8175== For lists of detected and suppressed errors, rerun with: -s
==8175== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
【问题讨论】:
-
tokens[n - 1] = p:不是将指针分配给将被释放的缓冲区,而是复制字符串。你可以使用strdup(3)或其他东西来做到这一点。