gpt4 book ai didi

c - C中的可变大小数组。可以吗?

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:00 26 4
gpt4 key购买 nike

我的座右铭是在系统负载最小的情况下将一些虚拟数据写入文件。数据的大小在运行时是未知的和指定的。

为此,我可以想到 2 个解决方案。

1) 使用动态内存分配

reserve_size_in_file (int reserve_size, FILE *fp) 
{
char *p
p = malloc(reserve_size)
fwrite(p, sizeof(*p), 1, fp);
free(p);
}

2) 使用数组

reserve_size_in_file (int reserve_size, FILE *fp) 
{
char arr[reserve_size];
fwrite(arr, sizeof(arr), 1, fp);
}

我认为第二种方法不能像声明一个可变长度的数组(ewww...)那样工作,我认为是不允许的。但它正在工作。现在我的问题是,这样使用它可以吗?另外,如果还有其他更好的方法,请提出建议。

注意:我不能使用 fallocate(),因为我必须只处理流 IO。

编辑:

我刚刚看到我可以使用 fileno(fp) 和 fallocate()。但是我没有看到很多应用程序使用 fallocate()。使用 fallocate() 有什么问题

例如:fallocate(fileno(fp), 0, 0, 100000);

最佳答案

Variable length arrays (VLA) 是 C99 标准功能,只要您知道您将使用的所有编译器都支持 C99,就可以使用。尽管 C11 标准使可变长度数组成为可选的。两者 gccclang作为扩展,甚至在 C99 模式之外也支持 VLA。另一方面,Visual Studio 直到最近才支持 C99,我认为他们还不支持 VLA。

如果您事先不知道大小,另一种方法是通过 malloc 进行动态内存分配。

正如 Jens 指出的那样,VLA 确实进入堆栈并且您有 limited stack space如果数组的大小很大,这可能是个问题,如果是这种情况,那么您将不得不使用动态内存。

关于c - C中的可变大小数组。可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22350608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com