int array[] = {2, 3, 4, 6};
int array[6] = {2, 3, 4, 6};
int array[MAX_SIZE] = {2, 3, 4, 6};
在第一个声明中,我没有提到阵列可以容纳的元素数量。第二个阵列可容纳6个元素,第三个阵列也可容纳6个元素。当我使用sizeof(array)
来确定大小时。第一个数组的大小为16.第二个和第三个数组分别为24个。
为什么我不喜欢第一个?因为它使用了内存,因为它没有元素。在第二和第三的情况下,我首先告诉不。它可以容纳的元素和大小变成24.此外,我无法将这些记忆用于其他工作。
使用malloc(6 * sizeof(int))
进行初始化并调用free(array)
的另一种方法。这将允许我使用未使用的内存。但是我为什么要这样做,因为array[]
使用内存作为它所拥有的元素。 malloc
也做了同样的事情,但写起来很容易记住array[]
。
答案 0 :(得分:2)
问:没有MAX_ELEMENTS初始化阵列会更好吗?
答:这取决于你想做什么!
使用此:
int array[] = {2, 3, 4, 6};
当您希望数组具有与初始化过程中的元素完全相同的单元格时。请注意,int array[4] = {2, 3, 4, 6};
是等效的。
使用此:
int array[6] = {2, 3, 4, 6};
当你知道你需要更多的单元格时,它们会在初始化过程之后被填满。
此:
int array[MAX_SIZE] = {2, 3, 4, 6};
当MAX_SIZE = 6
时,等同于上述情况。
你应该检查一下:
Difference between static memory allocation and dynamic memory allocation
和sizeof()
运算符的这个:
How do I determine the size of my array in C?
因此,如果您确切知道数组将包含多少元素,请使用静态内存分配,如果您不知道,请使用动态内存分配。
答案 1 :(得分:0)
我认为您对sizeof运算符感到困惑,并假设您获得的数字16是数组元素的数量。这不是真的。 sizeof运算符为您提供传递的对象大小(在低级意义上,而不是在面向对象的意义上),以字节为单位。所以,你得到16个字节,这意味着4个元素,因为int有4个字节。
答案 2 :(得分:0)
答案取决于您打算如何使用数组。
如果数组在编译时包含一组已知元素且仅包含那些元素,则不要指定大小。然后,如果需要遍历数组,可以使用以下语法:
for (i = 0; i < sizeof(array)/sizeof(array[0]); i++)
如果您想要在列表中添加或删除元素,则无需更改上述语句。
如果数组的大小与其初始元素的大小无关,或者数组未初始化或部分初始化,则指定大小。