如何释放字符串(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);