首先,如果我在函数中释放分配,这听起来可能正常,但事实并非如此。当我写这些内容时,我找到了一个解决方法,但是我希望在我的代码中保持一定的同质性,并且希望保持它的方式,但是你知道正常工作,那么是否有其他解决方案或我的解决方法是唯一的选择吗?
主要功能:
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
}
正如我之前所说,我希望在我的代码中保持同质性,并且希望保留一个类似于我拥有的其他函数的函数签名。我的解决方法正常工作。我想知道它是否是唯一的解决方案,或者我错过了什么。
编辑:在评论之后我添加了更多代码。
谢谢你, 亚历克斯。
答案 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)并且根本没有数组变量。这似乎也是非常错误的。