提问人:z4x 提问时间:10/19/2023 最后编辑:z4x 更新时间:10/19/2023 访问量:64
C - 被调用方函数内部的结构变量,它应该是指针还是无关紧要
C - Struct variable inside callee function, should it be a pointer or dosent it matter
问:
我有点混淆了结构变量的内存分配如何工作以及结构变量声明如何工作。
我的理解是,当我在函数外部声明一个结构变量时(并使用它,因此它不会被编译器优化),内存会保留给结构的总大小(也许更多用于填充)。
我对函数内部发生的事情感到困惑/当结构没有初始化而是从其他地方传递时。
示例代码:
typedef struct mystruct MyStruct;
typedef struct myinnerstruct MyInnerStruct;
struct myinnerstruct{
int b;
};
struct mystruct{
int a;
MyInnerStruct some;
};
.....
void someFunc(MyStruct* some_ptr){
MyInnerStruct something = some_ptr->some;
// Or
MyInnerStruct* something = &some_ptr->some;
}
在示例中,someFunc 的参数 some_ptr 的类型指针为 MyStruct。因为如果使用 MyStruct 本身,则该参数将具有 MyStruct 所需的内存,而不仅仅是结构体起始地址的内存。
但是函数内部的变量呢?两个表达式是否相等,或者这里会发生什么。就像它不会复制 myinnerstruct 一样,那么它甚至可以使用更多内存吗?
编辑:在这种情况下,我的意思是不应该复制MyInnerStruct变量,它应该只用于访问传递的原始结构的相应元素。
此外,代码以 mental 为例,mystruct、myinnerstruct 等可能要复杂得多,包含许多变量、指针和其他结构
答:
编辑:在这种情况下,我的意思是不应该复制MyInnerStruct变量,它应该只用于访问传递的原始结构的相应元素。
那么函数设计得不好,它应该使用 const 正确性:
void someFunc(const MyStruct* some_ptr){
之后,我们可以得出结论,我们需要访问内部结构体,以访问指向只读内存的类似指针:
const MyInnerStruct* something = &some_ptr->some;
这不会复制任何内容。但是,没有明显的需要创建这个额外的指针变量,我们可以直接访问。some_ptr->some
而会制作内部结构的“硬拷贝”——本地分配的相同副本。修改本地副本也不会影响调用方端的结构。复制这样的结构是可以的,只要它们不包含任何指向其他地方分配的内存的指针成员。但是仅仅为了复制而复制是一个坏主意,因为复制会占用执行速度。MyInnerStruct something = some_ptr->some;
评论
int