通过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 最一致的)方法是返回布尔值:当 avcounter 都已成功修改时返回 true,否则返回 false 并离开 avcounter未修改。 @hyde:否则使用返回值确实是个好主意。 决定使用第一种方法,它似乎工作!谢谢!【参考方案2】:

对动态数组使用双指针int **av 而不是int *av

void availableMoves(int array[][3], int **av, int *counter)

并进入函数将av更改为*av

【讨论】:

以上是关于通过C中的void函数返回动态数组的主要内容,如果未能解决你的问题,请参考以下文章

c语言动态数组如何扩充空间

C语言如何给用函数二维数组动态赋值

一维动态数组和二维动态数组的创建和使用

动态数组分配仅返回所有索引中的最后一个元素 C

堆栈动态和堆栈动态数组

C语言 如何给指针数组划分动态存储空间