如何在C中使用具有双重结构的动态分配(malloc)?

如何在C中使用具有双重结构的动态分配(malloc)?,c,malloc,clang,structure,allocation,C,Malloc,Clang,Structure,Allocation,我想知道如何在C中使用双重结构的动态分配(malloc) 我想制作一个这样的程序 输入科目1名称:数学 输入主题2名称:英语 输入名称:Kim 输入名称:Park 输入Taker3名称:John 输入接受者4姓名:David 输入Taker5名称:Kelly 输入接受器6名称:Fiona 输入接受者7姓名:Amanda 输入接受者8姓名:Sally 输入接受器9名称:Lee 输入Taker10名称:Kang -结果- 金:数学,英语 帕克:数学,英语 约翰:数学,英语 大卫:数学,英语 凯莉:数

我想知道如何在C中使用双重结构的动态分配(malloc)

我想制作一个这样的程序

输入科目1名称:数学

输入主题2名称:英语

输入名称:Kim

输入名称:Park

输入Taker3名称:John

输入接受者4姓名:David

输入Taker5名称:Kelly

输入接受器6名称:Fiona

输入接受者7姓名:Amanda

输入接受者8姓名:Sally

输入接受器9名称:Lee

输入Taker10名称:Kang

-结果-

金:数学,英语

帕克:数学,英语

约翰:数学,英语

大卫:数学,英语

凯莉:数学,英语

菲奥娜:数学,英语

阿曼达:数学,英语

莎莉:数学,英语

李:数学,英语

康:数学,英语

这是我编写的代码,它表示两个相互关联的结构

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SNUM 2          
#define TNUM 10             

typedef struct subscore {           
    char cname[SNUM][20];       
    int score[SNUM];                
} sscore;

typedef struct Taker {              
    char *name;                         
    sscore score;                   
} tTaker;

...

void main() {
    tTaker **teta[TNUM];
    create_Taker(teta);

    printf("-RESULT-\n");
    print_Taker(tTaker ** teta);
    ...

    delete_Taker(teta);
}


void create_Taker(tTaker ** teta) {

    char str[80];
    int len;

    for (int i = 0; i < SNUM; i++) {
        printf("Input Subject%d Name : ", i + 1);
        gets_s(str, 80);
        len = strlen(str) + 1;      
        teta[i]->score.cname = (char **)malloc(sizeof(char)*len); // ERROR!     
        strcpy_s(tt[i]->score.cname, sizeof(char), str);    
    }

    for (int i = 0; i<TNUM; i++) {
        printf("Input Taker%d Name : ", i + 1);
        gets_s(str, 80);
        len = strlen(str) + 1;
        teta[i]->name = (char **)malloc(sizeof(char)*len);  
        strcpy_s(teta[i]->name, sizeof(char), str); 
    }
    getchar();  
}

...

void print_Taker(tTaker ** teta) {
        ...
}

void delete_Taker(tTaker **teta) {
    for (int i = 0; i < TNUM; i++) {        
        free(teta[i]->score.cname);         
        free(teta[i]->name);                    
    }
}
我需要你的大力帮助。谢谢

这是一张表示程序内存外观的图片


**是指向指针的指针

例如:

int a;
int *x = &a;
int **y = &x;
这里是一个变量。x是一个指针,其地址为a。y是指向指针的指针,其地址为指针x

y不能保存变量a的地址。ie
int**y=&a无效

类似地,如果我执行
printf(“%d”,*y)它将打印指针x的地址,而不是a中的值

好的,现在来回答你的问题

tTaker**teta[TNUM]
是指向一个指针的指针,该指针可以保存指向
tTaker
的任何指针的地址

在这一行中,
teta[i]>score.cname=(char**)malloc(sizeof(char)*len)
teta[i]->score.cname
无效,因为您无法访问
score.cname
,因为teta不是指向tTaker的指针,而是指向指针的指针


您还没有初始化
tTaker**teta[TNUM],创建指针表示创建对象。您需要分配对象并将其分配给teta。

C不容易通过试错学习。最好读一本书,或者做一个教程。
teta[i]>score.cname=(char**)malloc(sizeof(char)*len);
cname
是字符的二维数组。你为什么要给它分配一个指针呢。数组不是指针。1)
tTaker**teta[TNUM];创设接受者(teta)类型不匹配
create_Taker
requires
tTaker**
注意,你发明了一个术语,双重结构,它是什么?如果你是指两种结构,就说“两种结构”。@lharob AI Asimi对不起,我的英语不好。我是韩国人,所以英语不是我的母语。所以我的英语看起来很可笑。我会记住你的话!谢谢你谢谢你的解释!当我继续试图解决这个问题时,我会参考你的解释。
void delete_Taker(tTaker **teta) {} 
int a;
int *x = &a;
int **y = &x;