返回动态分配的数组? (C)

时间:2019-01-29 09:49:23

标签: c arrays pointers dynamic-memory-allocation

考虑给定的2d数组分配:

int (*some)[10] = malloc(sizeof(int[10][10]));

这将分配一个10 x 10 2d数组。显然,它的类型是int (*)[10]。我想写一个函数initialize()来分配它,初始化它,然后返回一个指向数组的指针,这样构造some[i][j]就可以在其他可以将指针传递给数组的函数中使用。它彼此。

原型(特别是initialize()的返回类型)应该是什么?

3 个答案:

答案 0 :(得分:7)

int (*initialize(void))[10] { ... }

initialize是一个不带参数的函数,它返回指向10 int数组的指针。

您应该为此使用typedef

答案 1 :(得分:0)

nrow个指针表分配给size个元素的(已分配)int数组

void *allocate_rows(int *(*ptr)[size], size_t nrows)
{
    int (*tmpptr)[size] = *ptr;

    *ptr = malloc(nrows * sizeof(*ptr));

    if(*ptr)
    {
        while(nrows--)
        {
            tmpptr = malloc(sizeof(*tmpptr));
            if(!tmpptr)
            {
                /* malloc failed do something */
            }
            else 
            {
                tmpptr++;
            }
        }
    return *ptr;
}

答案 2 :(得分:0)

int (*some)[10] = malloc(sizeof *some);some是“指向10个int数组的指针。

如果您希望other是一个返回指向10个int数组的指针的函数,则可以从int (*some)[10];开始并将some替换为对该函数的调用希望得到您的声明。

int (*some)[10]; => int (*other(argument1,argument2))[10];

这就是在预标准化C语言中的工作方式。由于标准化C语言具有原型,因此您还可以将参数标识符列表替换为参数类型列表,例如:

int (*other(int argument1, double argument2))[10];

cdecl程序或cdecl website can help you verify the result

$ echo 'explain   int (*other(int,double))[10]'|cdecl
  declare other as function (int, double) returning pointer to array 10 of int

大多数人发现typedef更具可读性:

typedef int (*pointer_to_an_array_of_10_int)[10];
pointer_to_an_array_of_10_int other(int, double);

//to verify it's a compatible declaration 
int (*other(int , double ))[10];