【问题标题】:How can I access items in a dynamically allocated array of structs?如何访问动态分配的结构数组中的项目?
【发布时间】:2019-09-16 21:58:26
【问题描述】:

我现在在一个使用 C 的班级,我的一个作业要求我使用我的教授为我们编写的结构。它实际上是两个结构体,一个结构体基本上包含第一个结构体的数组。

这是他们的样子:

typedef struct cityStruct
{
    unsigned int zip;
    char *town
} city;
typedef struct zipTownsStruct
{
    int *towns;
    city **zips;
    city *cities
} zipTowns;

这是我为zipTowns 结构分配内存的函数:

void getArrs(zipTowns *arrs, int size)
{
    arrs->towns = malloc(sizeof(int) * size);
    arrs->zips = malloc(sizeof(city **) * size);
    arrs->cities = malloc(sizeof(city *) * size);
}

据我了解,我在这里所做的是根据大小变量为一定数量的ints、city 指针和city 结构分配内存空间。我知道这基本上就是数组。

我无法理解如何访问这些数组并操作其中的项目。写这个给我一个错误:

strcpy(arrs.cities[0]->town, "testTown\0");

你可以在这里看到我想要做什么。我想通过索引访问zipTowns 结构中的每个“城市”并插入一个值。

如何访问这些动态分配的结构数组中的项目?

【问题讨论】:

  • 错误说明了什么? IOW,cities 是数组 os 结构还是指针数组?
  • 请注意您的int * towns 分配sizeof(int) * size,而不是sizeof(int*) * size。您的分配指针算术被其他两个字段的一个引用关闭;你的city * * zips 应该分配sizeof(city * ) * size 而你的city * cities 应该分配sizeof(city) * size
  • 我想课堂练习的目的是教你如何使用指针。如果您无法跟随您的教练,请在线搜索有关它们的好教程

标签: c arrays pointers memory struct


【解决方案1】:

x->y 视为(*x).y

arrs 不是结构,它是指向结构的指针,而cities 不是指向结构的指针,它只是指向结构的指针。

使用arrs->cities[0].town 而不是arrs.cities[0]->town

但是,您仍然没有为这些结构分配足够的空间。这应该可以让您更清楚地了解分配的内容,并且还应该为您的数据提供足够的空间:

arrs->towns = malloc(sizeof(*arrs->towns) * size);
arrs->zips = malloc(sizeof(*arrs->zips) * size);
arrs->cities = malloc(sizeof(*arrs->cities) * size);

对于第二个和第三个,您只分配了足够的空间来存储指针而不是实际的数据类型。

通过这种方法,您将能够访问从arrs->cities[0]arrs->cities[9],您还可以通过执行arrs->cities[<number>].<member> 访问每个city 的成员。

您也不需要故意以空值终止您的字符串。这已经为您完成了。因此,您可以将"testTown\0" 替换为"testTown"

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 2019-07-19
    • 1970-01-01
    • 2012-03-25
    • 2011-12-13
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多