数组如何在结构中工作?
如果我有例如
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;
这不起作用,因为没有可以存储&myint
。 numbers
将在编译时转换为地址。
结构的大小总是由其成员的大小来定义。 因此,成员是简单的int,char,float还是arrary甚至是结构本身并不重要。