c - free() 在这种情况下如何工作?
问题描述
假设一个函数为一个字符串分配内存并返回它。调用该函数的变量,其中存储了它的返回字符串是一个指向已经动态分配的 char 的指针数组。我的疑问是,当我释放变量的内存时,它是否会同时释放变量内存和函数内字符串内存,或者函数内分配的内存是否与变量一成为一体?
char *function() {
//allocates memory for <string>
return <string>
}
int main() {
//<variable> declaration
//<variable> allocation
<variable> = function();
free(<variable>);
return 0;
}
出于实际原因,我省略了 //function 声明部分
感谢您的关注和帮助!
解决方案
有两种可能的情况:
- 函数使用动态内存分配分配内存,它是 100% 正确的
char *func(void)
{
char *x = malloc(100);
/* some code */
return x;
}
void foo(void)
{
char *y = func();
free(y);
}
- 其他分配内存的方式。当您尝试
free
它们时,它们都会调用未定义的行为。此外,当指向自动变量的指针在其定义的范围之外使用时,还有另一个 UB。
char w[100];
char *func(void)
{
char x[100];
/* some code */
return x;
}
char *func1(void)
{
static char x[100];
/* some code */
return x;
}
char *func2(void)
{
return w;
}
void foo(void)
{
char *y = func();
y[0] = 'a'; //UB
free(y); //UB
y = func1();
y[0] = 'a';
free(y); //UB
y = func2();
y[0] = 'a';
free(y); //UB
}
推荐阅读
- typescript - tsc --watch 重建项目但不包括 node_modules 中的更改
- prometheus - Prometheus 时间戳返回 Null
- android - 科尔多瓦 android vue avd 资源公共图像
- hyperledger - 在 Ubuntu 上安装 Indy-node 失败
- react-native - 如何使用 React Native / Expo CLI 可靠地检测网络状态
- html - 如何使样式为 inline-block 的链接的背景不会出现在其后续链接兄弟姐妹的后面?
- java - How to call postgresql function with more than one input and output parameter from Java?
- flutter - 当子部件更改 Flutter 时更改父变量并重建父部件
- yocto - 覆盖 `DEFAULTTUNE` 和其他机器配置参数
- java - Spring boot RestHighLevelClient 弹性搜索组合查询