如何释放字符串(C)?
所以基本上我声明了一个新字符串,我想给它分配一个数字,当我把它推到堆栈上时,我想释放这个字符串,给它另一个数字…等等。 代码如下:如何释放字符串(C)?,c,free,c-strings,C,Free,C Strings,所以基本上我声明了一个新字符串,我想给它分配一个数字,当我把它推到堆栈上时,我想释放这个字符串,给它另一个数字…等等。 代码如下: typedef struct skval skval; struct skval { int val; skval * pre; }; char * chcpy(char * str, char chr) { int len = strlen(str); str[len++] = chr; str = (char *)re
typedef struct skval skval;
struct skval
{
int val;
skval * pre;
};
char * chcpy(char * str, char chr)
{
int len = strlen(str);
str[len++] = chr;
str = (char *)realloc(str, (len + 1));
str[len] = '\0';
len++;
return str;
}
如果有其他方法来解决问题,我想知道。因为我确信这不是一种有效的方法…分配一大块。跟踪容量。只有在需要时才使用realloc。在
chcpy()
中调用strlen()
是个坏主意。结果为O(N^2)
。将length作为参数传递给chcpy()
。实际上,我想我找到了一个解决方案。我所做的就是每次通过循环创建一个新字符串。。。但我不知道它是否有效。尽管如此,它仍然有效。有更好的方法吗?@PhoenXHO只需记录长度和分配的大小。只有在需要时才使用realloc。一种常见的方法是在需要时将尺寸简单地增加一倍。然后在完成后立即释放所有内容。@PhoenXHO您应该只调用free()
一次,无论您调用realloc()
的频率有多高。如上所述,跟踪字符串的长度和分配的大小。当它们匹配时,调用realloc并增加大小。如果要重用字符串,请将长度和位置设置为0。然后,当您完全完成并且不再需要字符串时,调用free()
。
char * exp;
skval * vls = createStackVal();
char * svl = (char *)malloc(sizeof(char));
int i = 0;
*svl = '\0';
while (exp[i] != '\0')
{
if (isdigit(exp[i]))
{
while (exp[i] != ' ' && exp[i] != '\0')
{
svl = chcpy(svl, exp[i]);
i++;
}
vls = push_val(vls, atoi(svl));
/// free(svl); ...
}
i++;
}
printStackVal(vls);