在C中动态创建并初始化一个指向struct的指针数组

时间:2015-01-06 09:26:06

标签: c arrays pointers struct

以下是我正在尝试实现的示例代码

typedef struct
{
  int x_pos, y_pos;
} A;

typedef struct
{
  A **arrayAp;
} B;

int main(void) {
    B B;
    int n = 10;
    A *array[n];
    B.arrayAp = array;
    for (int i = 0; i < 10; i++)
    {
    B.arrayAp[i] = malloc(sizeof(A));
    B.arrayAp[i]->x_pos = i;
    B.arrayAp[i]->y_pos = i + 1;
    }
    printf("%d",B.arrayAp[0]->x_pos);
}

它可以正常工作。我可以使用“arrayAp”指针访问“数组”的元素。但是,当我尝试将一些代码移动到例如:

A * makeAnArray()
{
    int n = 10;
    A *array[n];
    return &array;
}

然后分配它返回“arrayAp”的值

B.arrayAp = makeAnArray();

现在我无法访问数组的第一个元素。程序崩溃。

printf("%d",B.arrayAp[0]->x_pos);

但是从第二个元素开始,一切都是一样的。

但是当我尝试使用此代码时,我遇到了更大的问题:

void initializeAnArray(B *B)
{
    for (int i = 0; i < 10; i++)
    {
    B->arrayAp[i] = malloc(sizeof(A));
    B->arrayAp[i]->x_pos = i;
    B->arrayAp[i]->y_pos = i + 1;
    }
}

好像没有效果。当我试图通过“arrayAp”指针访问数组成员时,我从内存中获取了一些“随机”值。

typedef struct
{
  int x_pos, y_pos;
} A;


typedef struct
{
  A **arrayAp;
} B;

A * makeAnArray()
{
    int n = 10;
    A *array[n];
    return &array;
}

void initializeAnArray(B *B)
{
    for (int i = 0; i < 10; i++)
    {
    B->arrayAp[i] = malloc(sizeof(A));
    B->arrayAp[i]->x_pos = i;
    B->arrayAp[i]->y_pos = i + 1;
    }
}

int main(void) {
    B B;
    B.arrayAp = makeAnArray();
    initializeAnArray(&B);
    printf("%d",B.arrayAp[1]->x_pos);
}

抱歉我的英语不好。

3 个答案:

答案 0 :(得分:2)

A * makeAnArray()
{
    int n = 10;
    A *array[n];
    return &array;
}

您正在返回一个本地指针,该指针在函数结束后死亡并导致UB。

此外,函数的返回类型应为A**,您应该使用*alloc分配内存并返回以确保每个实例都不同并且在函数调用后仍然有效。

可能的解决方法

A * makeAnArray()
{
    int n = 10;
    A *array = malloc(n * sizeof(A));
    return array;
}

答案 1 :(得分:2)

你的功能应该是:

A * makeAnArray()
{
    int n = 10;
    //A *array[n]; --> This is local to this function so won't work
    A *array = malloc(sizeof(A)*n); //--> Dynamic allocation
    return array;
}

答案 2 :(得分:1)

部分

A * makeAnArray()
{
    int n = 10;
    A *array[n];
    return &array;
}

无法运作。数组array可能在堆栈上分配,在makeAnArray终止后无法通过返回值访问;结果是未定义的行为。