【问题标题】:Can't free a Malloc'd string无法释放 Malloc 的字符串
【发布时间】:2016-02-28 21:37:49
【问题描述】:

我认为这个应该很快。

编辑:这是针对我的 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 中的字符串复制到一个新字符串中,但我一定做错了,因为我刚刚弄得一团糟。

那么,大家觉得呢?

【问题讨论】:

  • API 文档中提到调用者负责free返回值的情况并不少见。
  • 我不知道这意味着什么。这里很新,这是我 CS113 的第一个学期。到目前为止,我很喜欢它!
  • int num_zeros = ((cpu-&gt;word_size) - strlen(string)); 包含有符号-无符号错误
  • 调用 zeropad 的人必须在完成后释放返回的缓冲区。
  • strncat 在这里使用不正确:第一个参数必须是一个以 null 结尾的字符串。最好是strcpy(zero_string + i, string); return zero_string;

标签: c string malloc


【解决方案1】:

cpu-&gt;word_size 是什么?你确定cpu-&gt;word_size &gt;= strlen(string)无论如何?

无论如何,返回的缓冲区被分配错了,所以调用者有责任释放它。如果您知道所需的最大大小,另一种可能性是使用静态变量。这是代码。

#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())。

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2022-01-04
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多