【问题标题】:2D dynamic array in c - accessing allocated variablec中的2D动态数组 - 访问分配的变量
【发布时间】:2020-05-11 15:33:01
【问题描述】:

我(再次......)在 C 编码项目中苦苦挣扎。

请帮助我了解如何通过动态分配的二维数组访问动态分配的变量。 每次尝试都以失败告终,我找不到正确的语法...

尝试:将字符串放入分配到 **list 中的新 Family 中的 family_name 指针中。

scanf(" %s",&lod->list[0]->family_name);

程序:

#define _CRT_SECURE_NO_WARNINGS
//Libraries
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Consts, globals, structs 

#define MAX 10000

typedef struct person
{
    char *name;
    int gender;         //1-female, 0-male
} Person;

typedef struct family
{
    char *family_name;
    Person *mother, *father;    // parents' names
    Person **children_list; // list of the children in this family
    unsigned child_list_size;   // size of child_list array
    unsigned current_listChild_size;
} Family;

typedef struct listFamilys
{
    Family **list;
    unsigned current_listFamily_size;   // current size of family
}
ListFamilys;

//main
void main()
{
    ListFamilys *lod = (ListFamilys*) malloc(sizeof(ListFamilys));
        if(! lod) exit(0);
        lod->current_listFamily_size =0;
    lod->list = (Family**)malloc(sizeof(Family*));
    if (!lod->list) exit(0);
    printf("Enter family name: ");
    **scanf(" %s",&lod->list[0]->family_name);**
    system("pause");
}

【问题讨论】:

  • 没有TownInit函数无法编译代码。
  • 函数动态分配ListFamilys,将0放入current_listFamily_size。
  • 是的,但您需要实际更新问题中的代码以包含它。
  • 完成。提前致谢。

标签: c pointers dynamic syntax


【解决方案1】:

这里的问题只是类型错误加上分配不足。为了使其工作,您需要为一些 Family 指针(您正在做的,虽然只有 1 个)分配空间,然后是一个实际的 Family 元素(您没有做),然后为名称分配空间(您是不做)。基本上,代码应该是

lod->list = (Family**) malloc(sizeof(Family*));
lod->list[0] = (Family*) malloc(sizeof(Family));
lod->list[0]->family_name = (char*) calloc(11, 1);

你只做第一行。我在这里对calloc 的使用有些随意,10 个字符的限制也是如此。可以酌情修改。

然而,虽然这是让单个元素启动并运行的最简单方法,但由于您必须执行多少分配,这种方法在大规模上崩溃了,并且由于有多少单独的分配,取消分配内存成为一场噩梦使用这种方法制作的。因此,最好将 4kb 的名称空间分配给一个单独的指针,然后将个人和家庭的名称字段指向相关的名称,而不是为他们的每个名称单独分配。剩下的就这样吧。本质上,尝试提取分配,而不是像上面的代码那样逐个字段地使用它们。

【讨论】:

  • 在创建新的家庭对象后,我不应该能够在“family_name”中放入一个字符串吗? : lod->list[0]->family_name = "string" ;
  • 不一定。您可以使用数组创建一个字符串:char s[] = "string",然后将其指向该(...)family_name = string,但只要s 存在,它就有效。如果那是在main 中,那么它是永远的,但你永远不能将名称扩展得更远。
  • 另外,如果答案解决了您的问题,请给它评分。
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多