【问题标题】:How to free memory after returning the pointer返回指针后如何释放内存
【发布时间】:2021-07-27 09:13:50
【问题描述】:
char* stringFunction(char *astrics){

    char *string;

    string = (char*)malloc(MAX);
    string[0] = 0;
    strcat(string,"Hello ");
    strcat(string,astrics);
    strcat(string,"\n");
    return string;
    //free(string);
    
}

int main(int argc, char* argv){

    printf(stringFunction("Robert"));

    printf(stringFunction("Robert Greene"));

    return 0;
}

如果在 return 语句之后没有读取任何代码,那么我应该如何释放为指针分配的内存 - 字符串

【问题讨论】:

  • 您不能释放该函数中的指针。不允许调用者使用它,使整个函数无用。由调用者在使用后释放它。
  • 请不要将 data 作为格式化字符串传递给printf。使用%s 格式并提供数据字符串作为参数。如果要直接输出字符串,使用puts
  • 您需要将返回的指针保存在一个变量中,并在完成数据处理后将该变量传递给free
  • 顺便说一句,您的大部分代码都可以通过对snprintf:snprintf(string, MAX, "Hello %s\n", astrics) 的一次调用来替换。 snprintf 调用也可用于计算所需的确切内存量(有关详细信息,请参阅 this printf (and family) reference

标签: c pointers free


【解决方案1】:

当您返回分配的内存块时,您将所有权转移给调用者。这意味着调用者有责任在使用完内存块后释放它。或者,它可以反过来将所有权转移给它自己的调用者(等等等等......)

【讨论】:

    【解决方案2】:

    您的程序在使用完内存之前不应释放内存。在return 语句处,您的程序还没有完成使用该内存,因为main 函数仍然想要打印它!如果你释放了stringFunction 中的内存,那么main 将打印释放的内存。

    不要误以为必须释放指针。您不必释放指针。你只需要释放内存。

    在这种情况下,main 必须在使用完内存后释放内存并且不再需要它。这意味着我们不能只写printf(stringFunction(,因为我们需要将指针放入变量中。

    int main(int argc, char* argv){
    
        char *mystring = stringFunction("Robert");
        printf(mystring);
        free(mystring);
    
        mystring = stringFunction("Robert Greene");
        printf(mystring);
        free(mystring);
    
        return 0;
    }
    

    额外注意:你应该养成写printf("%s", mystring);的习惯,而不是printf(mystring);。否则,如果您将“Robert Greene”更改为“Robert %s”,您的程序可能会崩溃。但如果你使用printf("%s", mystring);,它只会打印“Hello Robert %s”

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 2014-03-28
      • 1970-01-01
      • 2013-06-30
      • 2013-10-20
      • 2022-01-07
      • 2022-09-27
      • 2021-07-30
      • 1970-01-01
      相关资源
      最近更新 更多