如果我有例如
typedef struct node
{
int numbers[5];
} node;
每当我创建这样一个结构的实例时,就会在堆栈中为数组本身分配内存,(在我们的例子中,20个字节为5个整数(将int作为32位)),而数字将是一个指向该缓冲区的第一个字节的指针。所以,我认为,因为在节点的实例内,将有一个20字节的缓冲区(对于5 int
s)和一个4字节的指针(numbers
),sizeof(node)
应该是24个字节。但是当我实际打印出来的时候是20个字节。
为什么会这样?为什么不考虑指向数组的指针?
我将非常感谢任何回应。
答案 0 :(得分:4)
数组不是指针:
int arr[10]
:
使用的内存量为sizeof(int)*10
字节
arr
和&arr
的值必须相同
arr
指向有效的内存地址,但不能设置为指向另一个内存地址
int* ptr = malloc(sizeof(int)*10)
:
使用的内存量为sizeof(int*) + sizeof(int)*10
字节
ptr
和&ptr
的值不一定相同(事实上,它们大多不同)
ptr
可以设置为指向有效和无效的内存地址,可以多次使用
答案 1 :(得分:3)
没有指针,只是一个数组。因此,struct的大小为sizeof(int [5])(加上可能的填充)。
结构node
及其成员numbers
共享地址。如果您有一个node
类型的变量或指向该变量的指针,则可以访问其成员。
答案 2 :(得分:1)
如果有int x;
等变量,则为该值留出空间。每当使用标识符x
时,编译器就会以适当的方式生成用于访问该空间中的数据的代码......不需要存储指向它的指针(如果有的话) ,你不需要指向那个指针的指针吗?还有一个指针指向那个?等等。)
当你有一个像int arr[5];
这样的数组时,空格会以同样的方式被搁置,但是对于5 int
s。当使用标识符arr
时,编译器生成代码以访问相关的数组元素或给出数组的地址(取决于它是如何使用的)。该数组不是指针,并且不包含一个......但在某些情况下,编译器可能会使用其地址而不是其内容。
在许多情况下,数组被称为衰变为指向其第一个元素的指针,但这只意味着在这些情况下,标识符将给出其地址而不是其内容,就像使用address-of运算符一样非数组变量。您可以使用int
获取x
&x
的地址这一事实并不意味着x
包含int
的地址...只是编译器知道如何解决它。
答案 3 :(得分:0)
Arrays不会那样工作。他们仅为其元素分配空间,但指针不。 "指针"你所说的(numbers
)只是一个占位符,用于表示数组的第一个元素;把它想象成文字,而不是变量。因此,您无法为其指定值。
int myint;
numbers = &myint;
这不会起作用,因为没有可以存储&myint
的内存。 numbers
将在编译时转换为地址。
答案 4 :(得分:0)
结构的大小始终由其成员的大小来定义。 因此,成员是简单的int,char,float还是arrary甚至结构本身并不重要。