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

时间:2017-04-09 11:18:50

标签: c malloc clang structure allocation

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

我想制作一个代表这样的程序

  

输入主题1名称:数学

     

输入主题2姓名:英文

     

输入Taker1名称:Kim

     

输入Taker2名称:Park

     

输入Taker3名称:John

     

输入Taker4名称:David

     

输入Taker5名称:Kelly

     

输入Taker6名称:Fiona

     

输入Taker7名称:Amanda

     

输入Taker8名称:莎莉

     

输入Taker9姓名:Lee

     

输入Taker10名称:Kang

     

-RESULT -

     金:数学,英语

     

Park:数学,英语

     

约翰:数学,英语

     

大卫:数学,英语

     凯莉:数学,英语

     

菲奥娜:数学,英语

     

Amanda:数学,英语

     莎莉:数学,英语

     李:数学,英语

     

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);                    
    }
}

从代码中可以看出,Structure'tTaker包含了另一个结构的'sscore'。 为此,我制作了这样的代码:

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();  
}

但是,正如您从代码中看到的那样,由于这一部分会出现一些问题:

teta[i]->score.cname = (char **)malloc(sizeof(char)*len); // ERROR!

我制作了这个代码来尝试创建一个动态分配函数......但它有很多我无法解决的问题。我使用Visual Studio 2017作为IDE,并且由于该部分,该程序打印了此错误消息。

  

警告C404

     

错误C2106:左值应为l值。

可悲的是,我的Visual Studio中的调试功能不起作用,所以没有办法解决这个问题...

我想让我的问题像我在介绍部分中展示的那样工作。

那部分有什么问题? 我想知道这个功能正常工作:

void delete_Taker(tTaker **teta) {} 

我需要你的大帮助。感谢。

这是表示程序内存如何的图片。

enter image description here

1 个答案:

答案 0 :(得分:0)

**是指向指针的指针。

示例:

int a;
int *x = &a;
int **y = &x;

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

y不能保存变量a的地址。即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 ..