在C语言中为自引用结构分配内存

在C语言中为自引用结构分配内存,c,C,我试图使用malloc为几个结构分配内存。我已经做了研究,但没有找到对我有帮助的东西。结构如下: typedef struct _square { char figure; int num_neighbors; struct _square *neighbors[7]; } point; typedef struct_plot { int num_squares; struct _square *dots; } plot; 指针*点应指向指向正方形(*

我试图使用malloc为几个结构分配内存。我已经做了研究,但没有找到对我有帮助的东西。结构如下:

typedef struct _square
{
    char figure;
    int num_neighbors;
    struct _square *neighbors[7];
} point;

typedef struct_plot
{
    int num_squares;
    struct _square *dots;
} plot;
指针*点应指向指向正方形(*邻居[7])的指针数组的第一个元素,num_squares的值是函数的输入

有人有什么想法吗

编辑: 以下是我一直在尝试的:

plot* plot_create(int size)
{
    plot *newPlot;
    square * square_neighbors[8];
    if((newPlot = (plot *)malloc(sizeof(plot))) == NULL)
    {
        printf("Allocation error");
        return NULL;
    }

    if((square_neighbors = (node *)malloc(size*sizeof(square))) == NULL)
    {
        printf("Allocation error 2");
        return NULL;
    }
    return newPlot;
}
指针*点应指向数组的第一个元素 指向正方形的指针(*邻居[7])

不,不应该。。。指向第一个相邻元素的指针类型是
struct\u square**
,而不是
struct\u square*

在编辑中,您将
malloc
的结果强制转换为
(节点*)
,该节点不是声明的类型,然后尝试将其分配给
square\u neights
,该节点是数组,无法分配给。它是一个由8个
square*
组成的数组,但是没有声明这样的类型。将其赋值给该局部变量后,返回时不使用该值,内存泄漏。另外,在原始代码中,您有
typedef struct\u plot
,这是一个打字错误

在向SO发布问题之前,请通过编译器运行您的代码,并修复它报告的打字错误和其他错误及警告。完成后,我们可以尝试解决您的概念错误。

指针数组 这应该清楚地说明你想做什么。在下面的代码中,我们首先将一个由8个指针组成的数组分配给点对象(struct_squares)。然后,我们为每个点对象分配内存,并根据需要初始化它们

您可以访问此数据结构,如图所示。请注意,这并不一定要连续分配内存(因为对malloc进行了多次调用)

示例程序
到目前为止你试过什么?你具体遇到了什么问题?请发布你的尝试和你认为错误的地方。注意:你在typedef struct_plot中有一个打字错误-它应该是typedef struct_plot。为什么一个正方形只有7个邻居?通常情况下,人们会假设8或4(取决于对角线是否算数)。@Jonathan OP还使用
正方形邻居[8]
。在编程类中,首先要教(敲入头部)的是封装的重要性,以清单常量为基本示例。您为8个驻留分配了空间,但只设置了7个驻留,OP的代码也使用了常量7和8。专业人员使用清单常量。你也没有利用情节结构。。。这一点很重要,因为OP说,
应该指向
邻居
的第一个元素,但这是类型不匹配。而且,
typedef结构{…}点
毫无意义地令人困惑。当有可用的typedef时,专业人员不会使用
struct\u square
声明。。。从
typedef struct Square开始(C++中不需要),然后使用
Square
@JimBalter我只是用他的代码回复OP。同意使用命名常量。我会更新答案来解决这个问题。TypeDef直接取自OP的问题…我没有看到编辑。这是一个教学网站,提问的人往往是一个非常困惑的初学者。。。“直接”抄袭他们的错误通常是个坏主意。
#include <stdio.h>

typedef struct _square
{
    char figure;
    int num_neighbors;
    struct _square *neighbors[7];
} point;

typedef struct _plot
{
    int num_squares;
    struct _square *dots;
} plot;

int main(void)
{
    int i;
    point** residents = malloc(8 * sizeof(point*));
    for (i = 0; i < 7; i++)
    {
        residents[i] = malloc(sizeof(point));
    }
    residents[0]->figure = 'A';
    residents[1]->figure = 'B';

    residents[0]->neighbors[0] = residents[1];
    printf("First neighbor of %c is %c\n",
        residents[0]->figure,
        residents[0]->neighbors[0]->figure);

    return 0;
}
First neighbor of A is B