分配固定大小数组的数组(并将其传递给函数)

时间:2016-06-24 13:02:21

标签: c

我有一个期望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 * *'吗?

4 个答案:

答案 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;