我正在尝试制作一个空数组。这是我的代码:
if(n == 0 || n == 1)
{
factors[] = {};
}
然而,它表示它希望在[]和{}内部有一个表达式。做这样的事情的正确语法是什么?
答案 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; {}可以在声明数组
时使用