c - 内存问题中具有动态数组成员分配位置的C结构
问题描述
我想知道在这个示例程序中 foo 和 arr* 在哪里分配。foo 是在堆栈上以恒定大小分配的,还是当我在 *arr 上使用 malloc 时它会改变?如果我将 foo.arr[i] for i 从 0 更改为 4,它会改变任何东西的大小吗?foo.arr 是在堆上分配的吗?foo.arr 大小的变化会改变 foo 的大小吗?
typedef struct {
int size;
int* arr;
} S;
int main(void) {
S foo;
int new_size = 5;
foo.size = new_size;
foo.arr = malloc(new_size * sizeof(int));
free(foo.arr);
return 0;
}
解决方案
您的困惑源于将指针与分配的空间混为一谈。简单地说,指针只是一个变量,它保存一个值,该值描述了另一个值在内存中的地址。指针所需的空间由体系结构的最大可寻址空间决定,而不是由分配的内存块决定。参考思考。
在这种情况下,foo
在堆栈中分配并且结构实例的大小保持不变。malloc
正在为您处理内存分配机制并将新的内存地址返回到分配的空间。随后,您将获取该内存地址并将其保存在arr
成员中。
此外,在堆栈中分配的任何内容本质上都必须是固定大小的。调用函数时需要知道堆栈帧的大小。考虑这样一个事实,即过程的每个参数都必须具有已知大小或指向堆中分配的某个结构的指针。
现在,考虑到所有这些,存在声明可变大小结构的机制,但您需要注意在堆中分配结构并显式处理内存。C99 标准引入了灵活的数组成员,它允许在结构声明中放置大小未确定的数组,前提是它伴随着另一个成员,并且它被放置为结构的最后一个成员。
推荐阅读
- django - django google_cloud_logging json 格式
- c# - 动画后WPF元素高度绑定丢失
- reactjs - 用多级对象反应 PropTypes
- python - ValueError:发现样本数量不一致的输入变量:[4, 25001] 似乎无法识别标头?
- python - 如何最有效地读取python中具有复数的txt文件?
- shell - 如何判断终端是否为windows终端
- ios - Azure 空间锚创建观察程序导致断言错误
- angularjs - 如何在表单上使用自定义 ng-pattern 函数
- html - 如何在 typescript vue js 项目中将 html 文件作为模板导入为模块,以便在多个组件中使用相同的 html 文件?
- google-cloud-platform - Google Cloud IoT 控制台日志中出现许多“MQTT disconnect - ALREADY_EXISTS”错误