gpt4 book ai didi

c - 专业阵列处理

转载 作者:太空宇宙 更新时间:2023-11-04 03:57:13 25 4
gpt4 key购买 nike

我是一个没有经验的 C 程序员:我想要 5000 以下的所有数字,它们是 5 的倍数。这是我目前的做法:

int main()
{
int i;
const int max =5000-1;
for(i=2; i<(max+1); i++)
{
if(!(i%5))
{
printf("%d\n", i);
}
}
return 0;
}

假设我希望将它们全部列在一个数组中。我能做的就是预先分配一个整数数组并填写各个位置。当然,我无法预先知道确切的所需长度,所以我会高估它的长度。

但是,我来自 C++ 背景,所以通常我会在那里做的是推回一个 vector ,一切都干净整洁。但是在 C 中执行此操作的专业方法是什么?你们会预先分配或动态调整数组的大小吗?

我目前正在使用 Herbert Schildt 的“Turbo C/C++”,我确信当我深入了解时会有更好(和最新)的引用资料。

最佳答案

realloc 可以完成您所说的一切。分配一个数组、增大一个数组、缩小一个数组:它完成了所有工作。

int max = 5000; /* why subtract one if you have to add one to use it? */
int *arr = NULL;
int i;

arr = realloc(arr, max * sizeof *arr); /* allocate generous array */
for (i = 0; i < max; i++) {
/* ... */
}
max = 10000;
arr = realloc(arr, max * sizeof *arr); /* grow array */

max = 100;
arr = realloc(arr, max * sizeof *arr); /* shrink array */

现在有一些流行的建议,您应该始终将 realloc 的返回值保存为一个单独的变量,并在覆盖您的实际指针变量之前检查它是否为 NULL。这是因为在某些奇怪的情况下 realloc 可能会失败,即使是在像缩小数组这样无害的事情上也是如此。如果 malloc 子系统是使用固定大小的桶实现的,则可能会发生这种情况。如果根本没有更多可用的“小”区域,则收缩请求可能会因固定大小的存储桶系统而失败。

如果 realloc 失败,它返回 NULL,但原始分配保持不变。如果您只是将返回值写入指针变量,则该数据将会丢失。所以,一般来说,您应该尝试这样做:

int *tmp;
tmp = realloc(arr, max * sizeof *arr);
if (tmp) {
arr = tmp;
} else {
/* maybe issue an error message? */
}

关于c - 专业阵列处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15312827/

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