【问题标题】:Allocating memory for a self-referential structure in C在 C 中为自引用结构分配内存
【发布时间】:2011-12-06 04:02:14
【问题描述】:

我正在尝试使用 malloc 为几个结构分配内存。我已经完成了研究,但找不到任何对我有帮助的东西。以下是结构:

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

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

指针 *dots 应指向正方形指针数组 (*neighbors[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;
}

【问题讨论】:

  • 到目前为止你尝试过什么?您具体遇到了什么问题?
  • 请发表您的尝试以及您认为错误的地方。
  • 注意:你在 typedef struct_plot 中有错字 - 它应该是 typedef struct _plot。
  • 为什么一个正方形只有 7 个邻居?通常,人们会假设 8 或 4(取决于对角线是否计算在内)。
  • @Jonathan OP 也使用square_neighbors[8]。在编程课上应该教的第一件事(鼓掌)是封装的重要性,以清单常量作为基本示例。

标签: c


【解决方案1】:

指针数组

这应该澄清你想要做什么。在下面的代码中,我们首先分配一个包含 8 个指针的数组,指向点对象(struct _squares)。然后我们为每个点对象分配内存并根据需要对其进行初始化。

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

示例程序

#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

【讨论】:

  • 你为8个居民分配房间但只设置了7个,OP的代码也使用了常量7和8。专业人士使用清单常量。此外,您没有使用任何情节结构......这很重要,因为 OP 说 dots 应该指向 neighbors 的第一个元素,但这是类型不匹配。此外,typedef struct _square { ... } point 毫无意义地令人困惑。当有可用的 typedef 时,专业人士不会使用 struct _square 声明......从 typedef struct Square Square; 开始(在 C++ 中不需要),然后使用 Square
  • @JimBalter 我只是用他的代码回复 OP。同意使用命名常量。我会更新答案来解决这个问题。 typedef 直接取自 OP 的问题...
  • 我没有看到修改。这是一个教学网站,提出问题的人通常是一个非常困惑的初学者......“直接”复制他们的错误通常是一个坏主意。
【解决方案2】:

指针 *dots 应该指向数组的第一个元素 指向正方形的指针 (*neighbors[7])

不,不应该……指向邻居第一个元素的指针的类型是struct _square **,而不是struct _square *

在您的 EDIT 中,您将 malloc 的结果强制转换为 (node *),这不是声明的类型,然后您尝试将其分配给 square_neighbors,这是一个无法分配的数组。它是一个由 8 个square* 组成的数组,但没有声明这样的类型。并且在将它分配给该局部变量之后,您在不使用该值的情况下返回,从而泄漏内存。同样在您的原始代码中,您有 typedef struct_plot 这是一个错字。

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

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 2015-11-09
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多