通过C中的void函数返回动态数组
Posted
技术标签:
【中文标题】通过C中的void函数返回动态数组【英文标题】:Returning dynamic array through void function in C 【发布时间】:2012-12-16 18:00:40 【问题描述】:在我的 C 程序中,我使用带有以下参数的 void 函数: 一个 2D int 数组,一个用于创建新动态数组的 int 指针和一个 last int 指针,它将保存函数内部发生的一些计数。 所以动态数组是使用 malloc 在函数中创建的,一切正常,直到我在调用函数后在 main() 中打印它的元素。我得到的是垃圾而不是我应该看到的数字。函数代码如下:
void availableMoves(int array[][3], int *av, int *counter)
int i, j;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
if (array[i][j] == E)
printf("%d ", 3*i + j + 1);
(*counter)++;
av = (int *) malloc(*counter * sizeof(int));
if (av == NULL)
printf("ERROR!");
else
for (i=0; i<*counter; i++)
*(av + i) = 0;
int pos = 0;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
if (array[i][j] == E)
*(av + pos++) = 3*i + j + 1;
【问题讨论】:
只是对代码进行评论:由于您有错误情况,因此您不应该像在错误情况下那样修改*counter
。使用一个临时的int tmp_count = *counter;
变量,并仅在函数成功时将其分配回*counter
。或者,如果 malloc 失败或其他原因,请将其设为 abort();
。避免产生“部分”结果(av=null
但*counter
仍被修改)。
尝试理解指针解引用和索引。 *(av + pos++) = 3*i + j + 1;
与 av[pos++] = 3*i + j + 1;
相同,但大多数人类读者更喜欢第二种形式。与(*counter)++;
类似,可以写成*counter += 1;
,避免使用括号。
@hyde:你是对的,但这是对 malloc 的快速检查,我还没有完成。 :)
@wildplasser:括号有问题吗?
不,它们没有任何问题。但大多数人倾向于减少括号的数量,只是因为用更少的 ((.)(.)) 更容易阅读。
【参考方案1】:
在这个函数中,av
是一个拷贝传递的指针。所以当你在函数内部改变指针的值时,原来的指针不会被修改。
有两种可能:
使用指向指针的指针(int **av
);
返回分配的指针 (return av
)。
所以要么:
void availableMoves(int array[][3], int **av, int *counter);
或者:
int *availableMoves(int array[][3], int *av, int *counter)
还有电话:
availableMoves(array, &av, &counter);
av = availableMoves(array, av, &counter);
【讨论】:
第三种(IMO 最一致的)方法是返回布尔值:当av
和 counter
都已成功修改时返回 true,否则返回 false 并离开 av
和 counter
未修改。
@hyde:否则使用返回值确实是个好主意。
决定使用第一种方法,它似乎工作!谢谢!【参考方案2】:
对动态数组使用双指针int **av
而不是int *av
void availableMoves(int array[][3], int **av, int *counter)
并进入函数将av
更改为*av
【讨论】:
以上是关于通过C中的void函数返回动态数组的主要内容,如果未能解决你的问题,请参考以下文章