我有一个期望wchar_t**
的函数,我正在分配它:
wchar_t * * lFilterPatterns = malloc(aNumOfFilterPatterns*sizeof(wchar_t *));
for (i = 0; i < aNumOfFilterPatterns; i++)
{
lFilterPatterns[i] = malloc(MAX_PATH_OR_CMD*sizeof(wchar_t));
}
是否有更好/更简单的方法来进行此分配?
编辑: 我宁愿只调用一次malloc。
这已被提出:
wchar_t (*lFilterPatterns)[MAX_PATH_OR_CMD] =
malloc(aNumOfFilterPatterns * sizeof * lFilterPatterns);
然后函数抱怨: 警告C4047:'功能':
'wchar_t * *' differs in levels of indirection from 'wchar_t (*)[1024]'
我可以将'wchar_t(*)[1024]'转换为'wchar_t * *'吗?
答案 0 :(得分:2)
如果您调用的函数需要wchar_t **
作为参数,那么不,实际上没有更好的方法来执行此操作。
答案 1 :(得分:0)
您可以使用void指针构建一个泛型函数。如果malloc在途中某处返回NULL,那么这一个mallocs就可以释放所有分配的内容。
void **alloc_2_dim(size_t ptrSize, size_t size, int n1, int n2)
{
void ** p = malloc(n1 * ptrSize);
if (p != NULL)
{
for (int i = 0; i < n1; i++)
{
p[i] = malloc(n2 * size);
if (p[i] == NULL)
{
for (int j = i; j >= 0; j--)
{
free(p[i]);
}
free(p);
p = NULL;
break;
}
}
}
return p;
}
像这样使用:
wchar_t **p = alloc_2_dim(sizeof(wchar_t *), sizeof(wchar_t), 10, MAX_PATH_OR_CMD);
char **p = alloc_2_dim(sizeof(char *), sizeof(char), 10, MAX_PATH_OR_CMD);
使用宏来删除sizeofs可以使它更清晰。
#define ALLOC_2D_CHAR(n1, n2) alloc_2_dim(sizeof(char *), sizeof(char), n1, n2)
#define ALLOC_2D_WCHAR(n1, n2) alloc_2_dim(sizeof(wchar_t *), sizeof(wchar_t), n1, n2)
答案 2 :(得分:0)
在C中有两种普遍接受的分配2D数组的方法:连续方法和不规则方法。两种方法都有其优点和缺点。例如,您可以随机播放由不规则方法制作的数组,但不是连续的。另一方面,它需要一个循环来释放衣衫褴褛,但只有一个快速的2个自由连续。
毗连:
int** table = (int**)malloc(sizeof(int*)*rows);
int* data = (int*)malloc(sizeof(int)*rows*columns);
int i = 0;
for( i = 0; i < rows; i++ )
table[i] = &data[i*columns]
释放连续:
free( table[0] );
free( table );
粗糙的:
int** table = (int**)malloc(sizeof(int*)*rows);
int i = 0;
for( i = 0; i < rows; i++ )
table[i] = (int*)malloc(sizeof(int)*columns);
释放衣衫褴褛:
for( i = 0; i < rows; i++ )
free( table[i] );
free( table );
答案 3 :(得分:-1)
你可以使用单维数组,然后你可以使用索引mappaing函数到达[i,j]元素:
单维数组的分配:
wchar_t * lFilterPatterns = malloc(aNumOfFilterPatterns*aNumOfFilterPatterns*sizeof( wchar_t));
索引检索功能:
int GetElementIndex(int i, int j, int length)
{
return i * length + j;
}
用法:
lFilterPatterns[GetElementIndex(i,j,aNumOfFilterPatterns)] = 1;