c - 将结构成员指针分配给另一个动态内存分配的指针是否安全?
问题描述
#include <stdio.h>
#include <stdlib.h>
struct Test {
const char *str;
};
void test_new(Test *test) {
char *s = malloc(100);
s[0] = 'H';
s[1] = 'i';
s[2] = '\0';
test->str = s;
}
int main(void) {
struct Test test;
test_new(&test);
puts(test.str);
free(test.str);
return 0;
}
这是允许的吗?将结构成员分配给函数中的局部变量(字符指针)test_new
?(test->str = s
允许吗?)
我听说数组变量在函数结束后被释放,它们是本地的。我想知道这是否适用于内存分配的局部变量。
像这样:
char *test(void) {
char s[100];
return s;
}
s
将在函数结束时消失,所以我想知道这是否适用于我的结构,尤其是我没有返回,而是更改了一个成员。
将结构成员指针(即test->str
)分配给另一个动态内存分配的指针(即s
)是否安全?
解决方案
从test_new
函数中让我们看看这两行:
// 1
char *s = malloc(100);
// 2
test->str = s;
在1
你有这样的事情之后:
+---+ +------------------+ | 小号 | --> | malloc 分配的内存... | +---+ +------------------+
然后在2
你有这样的事情之后:
+---+ | 小号 | ----------\ +---+ \ +-------------------+ >--> | malloc 分配的内存... | +-----------+ / +-------------------+ | 测试->str | --/ +-----------+
然后一旦test_new
返回,函数中只有这个main
:
+----------+ +-------------------+ | 测试.str | --> | malloc 分配的内存... | +----------+ +-------------------+
这很好。
推荐阅读
- cmake - 用作预构建命令的 CMake ninja 自定义目标会修改文件,但 ninja 在下一次构建期间会看到 depndecies 的变化
- angular - 有条件的可观察链
- ios - SWRevealViewController 使用 swift 以编程方式从菜单中打开第二个视图控制器
- python - 不明白为什么在列表理解中会出现 UnboundLocalError
- django - 无法从我的 Django Web 应用程序连接到 Amazon RDS Postgres 数据库
- mysql - 合并两个具有相同结构和数字总和的表
- python - 尝试安装时“获取构建轮子的要求...错误”--editable
- docker - 与 docker 内的 celery 交谈
- c# - 即使包含 System.Core.dll 也无法访问 System.Linq
- c# - 检查 C# 字符串是否是带有端口号的格式正确的 url