我是一个没有经验的 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? */
}
我是一名优秀的程序员,十分优秀!