超出这样的范围会释放相关的记忆吗?

pbe*_*ean 3 c memory malloc

我只是想知道,在下面的方案中,是在执行了method1之后释放的'stringvar'所使用的内存?

// Just some method
void method2(char* str)
{
  // Allocate 10 characters for str
  str = malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  method2(stringvar);

  // Is the memory freed hereafter, or do I need to call free()?
}
Run Code Online (Sandbox Code Playgroud)

我问,因为如果我在method1的末尾添加一个'free(stringvar)',我会得到一个警告,即stringvar在method1中是单元化的(这是真的).

And*_*ton 22

不,之后内存没有被释放method1,所以你会有内存泄漏.是的,你需要free在使用完内存后调用.

如果要分配内存,则需要发送指向指针的指针method2.这是C编程中常见的习惯用法,特别是当函数的返回值保留为整数状态代码时.例如,

void method2(char **str) {
    *str = (char *)malloc(10);
}

char *stringvar;
method2(&stringvar);
free(stringvar);
Run Code Online (Sandbox Code Playgroud)

  • 感谢您指出method2中相当严重的错误. (2认同)

nos*_*nos 5

不,动态分配的内存不会自动为您释放.在C中,程序员有责任自由.

另外 - C通过值传递变量,str = malloc(10*sizeof(char)); 只是分配给本地'str'变量.

好像你想要返回从malloc获得的指针,所以你的程序变成:

char *method2(void)
{
  // Allocate 10 characters for str
  return malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  stringvar = method2();
  ...
  free(stringvar);
}
Run Code Online (Sandbox Code Playgroud)

另一个选项,如果你想从method2中操纵'stringvar',就是传递一个指向'stringvar'的指针,例如

void method2(char** str)
{
  // Allocate 10 characters for str
  *str = malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  method2(&stringvar);
  ...
  free(stringvar);
}
Run Code Online (Sandbox Code Playgroud)