成为一名三星级程序员
您可以轻松地在函数中分配一些固定数量的元素(小于最大值),而无需在调用者函数和被调用者之间传递元素数量。但是,它需要创建一个指针数组,指向类型如何/为什么?本质上,您将数组视为以空字符结尾的字符串,最初将所有指针分配给数组中的类型,NULL
并仅根据需要为它们分配空间。(分配calloc
使这很容易)当数组在调用者中重新使用时,它允许迭代所有填充值,直到到达第一个空指针。
现在授予,
简单地将指向大小的指针作为附加参数传递给您的函数更有意义 [1]
并且消除了对三星级评级的需要,但出于示例的目的,请享受一段时间成为三星级程序员:
#include <stdio.h>
#include <stdlib.h>
#define INITSZ 21
void alloco (int ***ppa)
{
printf("inside %s\n", __func__);
int i = 0;
/* allocate 21 pointers-to-int */
if (!(*ppa = calloc (INITSZ, sizeof **ppa))) {
fprintf (stderr, "%s() error: virtual memory exhausted.\n", __func__);
exit (EXIT_FAILURE);
}
/* allocate/fill 20 values (or anything less than 21) */
for (i = 0; i < INITSZ - 1; i++) {
if (!((*ppa)[i] = calloc (1, sizeof ***ppa))) {
fprintf (stderr, "%s() error: virtual memory exhausted.\n", __func__);
exit (EXIT_FAILURE);
}
*((*ppa)[i]) = i * 2;
}
}
int main()
{
int **app = NULL;
int i = 0;
printf ("inside main\n");
alloco (&app);
/*ISSUE::how will i know to traverse only 20 indexes?*/
while (app[i]) {
printf("app[%d] = %d \n", i, *(app[i]));
i++;
}
return(0);
}
使用/输出
$ ./bin/alloc_array+1
inside main
inside alloco
app[0] = 0
app[1] = 2
app[2] = 4
app[3] = 6
app[4] = 8
app[5] = 10
app[6] = 12
app[7] = 14
app[8] = 16
app[9] = 18
app[10] = 20
app[11] = 22
app[12] = 24
app[13] = 26
app[14] = 28
app[15] = 30
app[16] = 32
app[17] = 34
app[18] = 36
app[19] = 38
脚注 [1]:为了清楚起见,在引文中添加了重点,即该解决方案旨在展示什么是可能的,而不是最有效或最实用的。