如何在C语言中将一个数组清空?

6

我正在尝试创建一个空数组。以下是我的代码:

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

然而,它说它期望在 [] 和 {} 中有一个表达式。如何正确使用语法实现这样的操作?

根据我的教练意见:如果给你输入0或1,则返回一个空列表(即长度为零的列表)。 - banana
1
你的评论提示这是一个XY问题。为什么不直接提供你想要完成的目标,而不是固定于你认为的实现方法呢? - StoryTeller - Unslander Monica
返回一个“空列表”还是一个“空数组”?是的,请先描述您遇到的问题。 - MrJLP
1
@JerseyFonseca - 我不知道你应该从哪里返回什么。在帖子中提供细节,而不是在评论中。如果您需要实现某种行为,请给出此行为的框架。重要的是要清楚地解释自己,而不是让我们从关于您导师说的晦涩评论中猜测您的意思。 - StoryTeller - Unslander Monica
1
@JerseyFonseca - 你说:“我的教练说,如果给你输入0或1,则返回一个空列表”。请注意,“list”和“array”通常是不同的东西。“list”通常指某种“链表”。列表可以为空(也就是head == NULL)。但数组不行。所以也许你误解了你的任务,使用了“array”。 - Support Ukraine
显示剩余5条评论
4个回答

4
TL;DR 从C语言的角度来看,要求无效。数组大小是固定的,无论使用要求如何,都不能增加或缩小。
引用C11,第§6.7.6.2章,数组声明符(强调我的部分):
除了可选类型限定符和关键字static之外,[和]可以表示表达式或*。如果它们表示一个表达式(指定数组的大小),则该表达式应具有整数类型。如果表达式是常量表达式,则其值应大于零。[...]
此外,根据初始化语法,C11,第§6.7.9章,花括号关闭的初始化器列表应至少有一个初始化器元素(对象)。形式为{ }的初始化器是无效的C语言。
注意:
如果你的意思是“我如何使C中的数组内容为空?”,那么假设“空”转换为值0,我们可以使用memset()或循环和赋值来完成这个操作。然而,这只是使数组内容为空,并没有改变数组的大小。

3

请尝试执行以下两个案例,以便更好地理解gcc的实际情况。

案例1:

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

案例二:

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

这是因为数组的名称代表基本元素的地址。此外,如果您声明一个具有特定大小的数组,则无法定义边界,并且可以访问超出边界的内存,直到声明该数组的段用尽为止。
针对您的代码 factors[] = {};,您不能这样做,因为这不是数组factors的声明,尽管您试图使用{}结构分配没有值。只有在初始化数组时才能将[]留空。

你知道在ISO C中,int arr[]={};实际上是无效的吗? - Sourav Ghosh
2
根据标准,int arr[]={};是无效的(仅在理论上)。但实际上,这是有效和可能的。如果您执行了我在答案中提到的两种情况,您将清楚地理解这一点。 - surendra nath
请在您提供的链接中,移除编译器选项部分中的所有开关--pedantic -Wextra -Werror -Wall。这些开关有助于进行严格编译,即将所有警告视为错误,并生成完全平台无关的代码。 - surendra nath
1
如果使用GCC配置为C编译器,这段代码根本无法编译。如果将GCC配置为其他编译器,则任何随机的垃圾代码当然可以编译。这个问题被标记为C语言,但没有标记GCC。问题中没有任何迹象表明使用了GCC。 - Lundin
3
很容易。GCC默认设置为编译非标准的"gnu90"或非标准的"gnu11",具体取决于它是否比GCC 5.0更旧或更新。如果您希望它成为符合规范的C编译器,则必须将代码编译为gcc -std=c11 -pedantic-errors,其中-std=c11是当前的C标准,而pedantic-errors意味着“根据标准要求进行实际编译”。如果您不设置这些内容,则无法将GCC用作标准的C编译器。 - Lundin
显示剩余6条评论

1

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

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


为什么不能创建一个固定大小为0的数组? - endolith
1
@endolith 不可以,C语言不允许这样做。数组必须有一个非零正数大小(唯一的例外是柔性数组成员)。 - Some programmer dude

0

你不能释放数组的内存,因为它是固定的。但你可以使用memset函数设置一些默认值,比如'0'。

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

在声明数组时,可以使用表达式[]和{}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接