C - 被调用方函数内部的结构变量,它应该是指针还是无关紧要

C - Struct variable inside callee function, should it be a pointer or dosent it matter

提问人:z4x 提问时间:10/19/2023 最后编辑:z4x 更新时间:10/19/2023 访问量:64

问:

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

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

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

示例代码:

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 等可能要复杂得多,包含许多变量、指针和其他结构

c 内存 结构 变量声明

评论

2赞 BoP 10/19/2023
这要视情况而定。:-)您是否需要副本,或者是否需要使用(可能修改)参数?这就是决定如何编码的原因。另请注意,指针可能大于 ,因此不清楚哪个指针使用的内存最多。int
0赞 Weijun Zhou 10/19/2023
您的第一行将复制内部结构。你的第二个没有。这基本上与外部结构无关。
0赞 z4x 10/19/2023
@BoP谢谢你,我编辑了这个问题来澄清,我不想要一个副本,而且它可以容纳比仅在 int 中更多的元素
1赞 Weijun Zhou 10/19/2023
然后你必须使用指针,如果你只需要从原始内部结构中读取而不写入它,请使用指向 const 的指针。
0赞 z4x 10/19/2023
谢谢大家,我不知何故认为像这样的复制不会在 c 中退出......

答:

1赞 Lundin 10/19/2023 #1

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

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

void someFunc(const MyStruct* some_ptr){

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

const MyInnerStruct* something = &some_ptr->some;

这不会复制任何内容。但是,没有明显的需要创建这个额外的指针变量,我们可以直接访问。some_ptr->some

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

评论

0赞 z4x 10/19/2023
谢谢你,我现在明白了。我使用这些额外的指针变量来提高可读性,因为真正的结构更复杂,包含包含结构的结构等等......