c语言 - 无法释放 Malloc'd 字符串



我认为这个应该很快。

编辑:这是给我的CS113班的。我只需要释放所有的记忆。如果Valgrind发现任何内存泄漏,我会丢分P

无论如何,我发现它显然只需要我在Main中释放与zero_pad返回值相关的内容。一旦我这么做了,效果就很好。如果我知道怎么做的话,我会把这篇文章标记为"完整"。

char *zero_pad(struct cpu_t *cpu, char *string)
{
    char *zero_string = malloc(cpu->word_size + 1); 
    int num_zeros = ((cpu->word_size) - strlen(string));
    int i;
    for(i = 0; i < num_zeros; i++)
    {
        zero_string[i] = '0';
    }
    return strncat(zero_string, string, strlen(string));    
}

我需要释放zero_string,因为我已经分配了它。但是,我不知道怎么做。如果我在返回之前释放它,那么我已经丢失了数据,无法返回。如果我在之后尝试释放它,函数已经返回,因此无法继续释放它。

我试图使用strcpy将zero_string中的字符串复制到一个新的字符串中,但我一定做错了,因为我最终得到了一个巨大的混乱。

那么,你们都怎么想呢?

什么是cpu->word_size?你确定cpu->word_size >= strlen(string)在任何情况下?

无论如何,返回的缓冲区是mallocated的,因此调用方有责任释放它。另一种可能性是,如果您知道所需的最大大小,则使用静态变量。这就是代码。

#define MAX_SIZE 128 /* adjust this */
char *zero_pad(struct cpu_t *cpu, char *string)
{
    static char zero_string[MAX_SIZE]; 
    int num_zeros = ((cpu->word_size) - strlen(string));
    int i;
    for(i = 0; i < num_zeros; i++)
    {
        zero_string[i] = '0';
    }
    strcpy(zero_string + i, string); 
    return zero_string;   
}

显然,应该通知调用者返回的缓冲区总是相同的(如果需要,调用者必须复制返回的缓冲区时,例如使用strdup()和稍后的free())。

最新更新