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



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

我想制作一个像这样的程序

输入主题1 姓名 : 数学

输入主题2 姓名 : 英文

输入接收者1 姓名 : 金

输入 Taker2 名称 : Park

输入 Taker3 姓名 : John

输入 Taker4 姓名 : David

输入接收者5 姓名 : 凯利

输入接受者6 姓名 : 菲奥娜

输入接收者7 姓名 : 阿曼达

输入 Taker8 姓名 : 莎莉

输入接收者9 姓名 : 李

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

从代码中可以看出,结构"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) {} 

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

这是代表程序内存外观的图片。

在此处输入图像描述

** 是指向指针的指针。

例:

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

这里 a 是变量。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];,创建指针意味着创建对象。 您需要分配对象并将其分配给泰塔。

相关内容

  • 没有找到相关文章

最新更新