无法释放Malloc'd字符串

时间:2015-11-25 22:38:36

标签: c string malloc

我认为这应该很快。

编辑:这是我的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中的字符串复制到一个新字符串中,但我一定是做错了,因为我最终得到了大量的混乱。

那么,你们都在想什么?

1 个答案:

答案 0 :(得分:0)

什么是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())。