数组如何在结构中工作?

如果我有例如

typedef struct node { int numbers[5]; } node; 

每当我创建这样一个结构的实例时,就会在堆栈中为数组本身分配内存(在我们的例子中为5个整数的20个字节(考虑整数为32位)),数字将成为指向该缓冲区的第一个字节。 所以,我认为,因为在节点的实例内部,将有一个20字节的缓冲区(对于5个int )和一个4字节的指针( numbers ), sizeof(node)应该是24个字节。 但是当我实际打印出来的时候说是20个字节。
为什么会这样? 为什么不考虑指向数组的指针?
我将非常感谢任何回应。

数组不是指针:


  • int arr[10]

    • 使用的内存量是sizeof(int)*10个字节

    • arr&arr的值必须相同

    • arr指向有效的内存地址,但不能设置为指向另一个内存地址


  • int* ptr = malloc(sizeof(int)*10)

    • 使用的内存量是sizeof(int*) + sizeof(int)*10个字节

    • ptr&ptr的值不一定相同(事实上,它们大多不同)

    • ptr可以设置为指向有效和无效的内存地址,可以多次使用

没有指针,只是一个数组。 因此结构的大小为sizeof(int [5])(加上可能的填充)。

struct node及其成员numbers共享地址。 如果您有一个类型为node的变量或指向该变量的指针,则可以访问其成员。

当你有一个变量,如int x; 为价值留出空间。 每当使用标识符x ,编译器生成代码以适当的方式访问该空间中的数据……不需要存储指向它的指针来执行此操作(如果有,则不需要指针到那个指针?指向那个?等等。

当你有像int arr[5];这样的数组时int arr[5]; ,空间以同样的方式被搁置,但是对于5个int 。 当使用标识符arr ,编译器生成代码以访问相关的数组元素或给出数组的地址(取决于它的使用方式)。 该数组不是指针,并且不包含一个……但在某些情况下,编译器可能会使用其地址而不是其内容。

在许多情况下,一个数组被称为衰减到指向其第一个元素的指针,但这只意味着在这些情况下,标识符将给出其地址而不是其内容,就像使用address-of运算符而非数组变量。 您可以使用&x获取int x的地址这一事实并不意味着x包含int的地址…只是编译器知道如何弄清楚它。

数组并不像那样工作。 它们为元素分配空间,但为指针分配空间。 你所谈论的“指针”( numbers )只是数组第一个元素地址的占位符; 把它想象成文字,而不是变量。 因此,您无法为其指定值。

 int myint; numbers = &myint; 

这不起作用,因为没有可以存储&myintnumbers将在编译时转换为地址。

结构的大小总是由其成员的大小来定义。 因此,成员是简单的int,char,float还是arrary甚至是结构本身并不重要。