C - 被调用函数内的结构变量,它应该是指针还是无所谓

问题描述 投票:0回答:1

我有点困惑结构变量的内存分配如何工作以及结构变量声明如何工作。

我的理解是,当我在函数外部声明一个结构变量时(并使用它,因此它不会被编译器优化),内存将被保留用于结构的总大小(可能更多用于填充) .

当结构未初始化而是从其他地方传递时,我对函数内部发生的情况感到困惑。

示例代码:

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 变量,它应该仅用于访问传递的原始结构的相应元素。

此外,以代码为例,mystruct、myinnerstruct 等可能要复杂得多,包含许多变量、指针和其他结构

c variables memory struct variable-declaration
1个回答
0
投票

编辑:在这种情况下,我的意思是不应该复制 MyInnerStruct 变量,它应该仅用于访问传递的原始结构的相应元素。

那么函数设计不好,应该使用const正确性

void someFunc(const MyStruct* some_ptr){

之后我们可以得出结论,我们需要访问内部结构以访问类似的只读内存指针:

const MyInnerStruct* something = &some_ptr->some;

这不会复制任何内容。然而,显然没有必要创建这个额外的指针变量,我们可以直接访问

some_ptr->some

MyInnerStruct something = some_ptr->some;
会制作内部结构的“硬拷贝” - 本地分配的相同副本。修改本地副本也不会影响调用方的结构。复制这样的结构体就可以了,只要它们不包含任何指向其他地方分配的内存的指针成员即可。但是仅仅为了复制而复制是一个坏主意,因为复制会占用执行速度。

© www.soinside.com 2019 - 2024. All rights reserved.