C:当参数返回空时传递双指针

时间:2016-02-03 13:21:33

标签: c function pointers parameters

首先,如果我在函数中释放分配,这听起来可能正常,但事实并非如此。当我写这些内容时,我找到了一个解决方法,但是我希望在我的代码中保持一定的同质性,并且希望保持它的方式,但是你知道正常工作,那么是否有其他解决方案或我的解决方法是唯一的选择吗?

主要功能:

void main(void)
{
    SHead head; // Custom struct
    unsigned char **array = NULL; // pointer to 2D array

    allocArray2D(&head, array) // the function signature: (SHead*, unsigned char**)

    // here, the array pointer is still NULL (0x0)
    //...

    return EXIT_SUCCESS;
}

分配函数malloc包含21个unsigned char *和每个简单指针21 unsigned char的非常少量的内存。 在函数内,指针很好并指向正确的地址。

所以我的工作是修改函数:

void allocArray(SHead* h, unsigned char** arr)
{
    int x, y, i;
    getsize(head, *x, *y);

    arr = (unsigned char**)malloc(sizeof(unsigned char*)*y);
    if(arr)
        printf(">> Erro allocating memory\n"), return;

    for(i =0; i<y; i++)
    {
        arr[i] = (unsigned char)malloc(sizeof(unsigned char)*x);
    }
}

以下内容:

unsigned char** allocArray(SHead*)
{
    int x, y, i;
    unsigned char **arr;
    getsize(head, *x, *y);

    arr = (unsigned char**)malloc(sizeof(unsigned char*)*y);
    if(arr)
        printf(">> Erro allocating memory\n"), return;

    for(i =0; i<y; i++)
    {
        arr[i] = (unsigned char)malloc(sizeof(unsigned char)*x);
    }

    return arr; // returning the address
}

正如我之前所说,我希望在我的代码中保持同质性,并且希望保留一个类似于我拥有的其他函数的函数签名。我的解决方法正常工作。我想知道它是否是唯一的解决方案,或者我错过了什么。

编辑:在评论之后我添加了更多代码。

谢谢你, 亚历克斯。

3 个答案:

答案 0 :(得分:0)

如果我正确地理解了你所需要的东西就像下面那样 为简单起见,我排除了引用结构的参数。

void allocArray2D( unsigned char ***a, size_t n )
{
    *a = malloc( n * sizeof( unsigned char * ) );

    for ( size_t i = 0; i < n; i++ ) ( *a )[i] = malloc( n * sizeof( unsigned char ) );
}

//...

unsigned char **array = NULL; // pointer to 2D array

allocArray2D( &array, 21 );

如果您希望在将原始对象传递给函数后将其更改,则必须通过引用传递它。

答案 1 :(得分:0)

你必须将指向2维数组的指针传递给你的函数,把函数写入指针后面的值:

SHead head; // Custom struct
unsigned char **array = NULL; // pointer to 2D array

allocArray2D(*head, &array)
                 // ^ address of array  

-

void allocArray(SHead* head, unsigned char*** pArray)
                                  // ^ pointer to char** because its an output parameter
{
    int x, y, i;
    getsize( head, &x, &y );

    *pArray = malloc( y * sizeof( unsigned char * ); 
 // ^ assigne somtething to the variable array refered by the pointer pArray
    if( *pArray == NULL ) 
    {
        printf(">> Erro allocating memory\n")
        return;
    }

    for ( i = 0; i < y; i ++ )
        (*pArray)[i] = malloc( x * sizeof( unsigned char ) );
}

注意,您所做的是将NULL - pointe传递给函数allocArray

另一种解决方案是通过函数allocArray的返回值返回已分配的内存:

 SHead head; // Custom struct
 unsigned char **array = NULL;

 array = allocArray( &head );

-

 unsigned char** allocArray( SHead* head )
 {
     int x, y, i;
     getsize( head, &x, &y );

     unsigned char** arr = malloc( y * sizeof( unsigned char * );
     if( arr  == NULL ) 
     {
        printf(">> Erro allocating memory\n")
        return;
     }

     for ( int i = 0; i < y; i ++ )
         arr[i] = malloc( x * sizeof( unsigned  char ) );
     return arr;
 }

答案 2 :(得分:0)

你的电话看起来很奇怪。

首先,你正在通过*头。 head似乎是一个未初始化的变量,因此传递* head看起来非常错误。

其次,调用的函数无法看到数组。您的调用等同于allocArray2D(* head,NULL)并且根本没有数组变量。这似乎也是非常错误的。