如何在C中使数组为空?

时间:2017-04-19 05:59:39

标签: c arrays initialization

我正在尝试制作一个空数组。这是我的代码:

if(n == 0 || n == 1)
{
    factors[] = {};
}

然而,它表示它希望在[]和{}内部有一个表达式。做这样的事情的正确语法是什么?

4 个答案:

答案 0 :(得分:2)

TL; DR 您不能,因为从C的角度来看要求无效。数组大小是固定的,无论是使用要求都无法增长或缩小。

引用C11,章节§6.7.6.2,数组声明符强调我的

  

除了可选的类型限定符和关键字static之外,[]可能会划界   表达式或* 。如果它们分隔表达式(指定数组的大小),则   表达式应具有整数类型。如果表达式是常量表达式,它应该是   值大于零。 [...]

此外,根据初始化语法C11,章节§6.7.9,括号闭合初始化列表应至少具有一个初始化元素(对象)。 { };形式的初始化程序无效C.

注意:

如果您的意思是“如何在C中使数组的内容为空?”,那么,在这种情况下,假设“empty”转换为值0,我们可以使用memset()或循环和赋值来完成这项工作。但是,这会使数组内容为空,而不是数组的大小。

答案 1 :(得分:1)

从技术上讲,无法使数组为空。数组将具有您无法更改的固定大小。

如果要重置数组中的,请使用默认值从另一个数组进行复制,或者循环遍历数组并重置每个值。

答案 2 :(得分:1)

尝试执行这两种情况,以便您可以了解gcc实际发生了什么。

案例1:

#include<stdio.h>
int main()
{
 int arr[]={};
 printf("size:%d\n",sizeof(arr));
}

案例2:

#include<stdio.h>
int main()
{
 int arr[]={};
 arr[0]=100;
 printf("size:%d\n%d\n",sizeof(arr),arr[0]);
}

这是因为数组的名称表示基本元素的地址。此外,如果声明一个具有特定大小的数组,则无法定义边界,甚至可以在边界之外访问内存,直到声明数组的段耗尽内存。

来到你的代码factors[] = {};,你不能这样做,因为这不是数组因子的声明,尽管你试图使用{}结构不分配任何值。只有在初始化数组时才能将[]留空。

答案 3 :(得分:0)

你不能释放阵列的内存,因为它是固定的。您可以设置一些默认值,例如&#39; 0&#39;使用memset函数。

void * memset(void * arrptr,int value,size_t n);

表达式[]&amp; {}可以在声明数组

时使用