c - 在 C 中动态创建和初始化指向结构的指针数组

标签 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”指针访问“array”的元素。但是当我尝试移动一些代码来运行时,例如:

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);
}

抱歉我的英语不好。

最佳答案

你的功能应该是:

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;
}

关于c - 在 C 中动态创建和初始化指向结构的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27795645/

相关文章:

c - 为什么程序没有崩溃?

c - 我怎样才能摆脱这个c警告?

c - uint8_t 类型数组的元素是否总是被打包到连续的内存字节中?

c# - 选择数组中的多个元素并将它们转换为列表 C#

php - 在 PHP 中传递第 1-2-3-4 页的数据...(无 session /cookie)

python - 如何在Matlab或Python中移动由零内切的矩形数组?

c - telldir()函数的返回值是多少?

c - 在 C 中修剪字符串(不使用库函数)

c - 在 C 中读取二进制文件的奇怪之处

二维数组指针的 C++ 内存泄漏