我有点搞不清 struct 变量的内存分配是如何工作的,以及 struct 变量声明是如何工作的.

我的理解是,当我在函数外部声明 struct 变量时(并使用它,这样编译器就不会对其进行优化),内存将保留给 struct 的总大小(可能还有更多的填充空间).

当 struct 没有被初始化,而是从其他地方传递时,我对函数内部发生的事情感到困惑.

示例代码:

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;

}

在本例中,ome Func具有类型指针为MyStruct的参数SOME_PTR.因为如果使用MyStruct本身,参数将拥有MyStruct所需的内存,而不仅仅是 struct 的起始地址的内存.

但是,函数内部的变量又如何呢?这两个表达式是否相等,或者这里会发生什么.就像它不会复制我的内部 struct 一样,那么它还会使用更多的内存吗?

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

此外,以代码为例,mystruct、myinnerstruct等可以更复杂,包含许多变量、指针和其他 struct

推荐答案

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

那么这个函数设计的不好,应该用const correctness:

void someFunc(const MyStruct* some_ptr){

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

const MyInnerStruct* something = &some_ptr->some;

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

MyInnerStruct something = some_ptr->some;将制作内部 struct 的"硬拷贝"--本地分配的完全相同的拷贝.修改本地副本也不会影响调用方的 struct .复制这样的 struct 是很好的,只要它们不包含任何指向分配给别处的内存的指针成员.但复制只是为了提高执行速度,这不是一个好主意.

C++相关问答推荐

理解C中的指针定义

如何避免使用相对路径包含在c中

C strlen on char array

是否有任何情况(特定类型/值),类型双关在所有符合标准的C实现中产生相同的行为?

exit(EXIT_FAILURE):Tcl C API类似功能

在C语言中使用scanf()时我无法理解的警告

ARM64 ASIMD固有的加载uint8_t* 到uint16x8(x3)?

如何在C中通过套接字自定义数据类型读取原始变量?

函数的限制限定指针参数允许优化调用方函数吗?

不同出处的指针可以相等吗?

这段代码用于在C中以相反的顺序打印数组,但它不起作用

程序对大输入给出错误答案

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

Matlab/Octave对conv2函数使用哪种方法?

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

是什么阻止编译器优化手写的 memcmp()?

为什么 C 字符串并不总是等同于字符数组?

窗口消息处理函数以某种方式更改了应保持不变的 int 变量的值

Codewars Kata 掷骰子的不稳定行为