数组如何在结构中工作?

时间:2014-12-23 08:50:30

标签: c arrays pointers struct

如果我有例如

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

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

5 个答案:

答案 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甚至结构本身并不重要。