C 如何读取动态分配矩阵的元素,其中每个元素都是一个结构

C 如何读取动态分配矩阵的元素,其中每个元素都是一个结构,c,matrix,C,Matrix,因此,我有一个包含3个不同指针变量的结构,我需要做的是初始化一个动态分配的矩阵,其中每个元素都是该结构的类型。我认为我已经正确地为矩阵和结构的成员分配了内存,但现在我不知道如何读取矩阵的每个元素。我是一个初学者,所以请原谅我的编码风格或任何其他错误。我的问题是如何读取动态分配矩阵中的元素,其中每个元素都是一个结构 (我知道在这个结构中我可以写“char*x,*y,*z;”但这样我看得更清楚) typedef结构{char*type_存在; 字符*目的地; 字符*方向; int无可用的礼物; }地

因此,我有一个包含3个不同指针变量的结构,我需要做的是初始化一个动态分配的矩阵,其中每个元素都是该结构的类型。我认为我已经正确地为矩阵和结构的成员分配了内存,但现在我不知道如何读取矩阵的每个元素。我是一个初学者,所以请原谅我的编码风格或任何其他错误。我的问题是如何读取动态分配矩阵中的元素,其中每个元素都是一个结构

(我知道在这个结构中我可以写“char*x,*y,*z;”但这样我看得更清楚)

typedef结构{char*type_存在;
字符*目的地;
字符*方向;
int无可用的礼物;
}地图;
int main(){
int max_线,max_col,i,j;
地图**地图;
//为矩阵分配内存
map=malloc(最大线*尺寸(map));
对于(i=0;i目的地=(char)malloc(1*sizeof(char));
(*map)->方向=(char)malloc(1*sizeof(char));
(*map)->type_present=(char)malloc(1*sizeof(char));
/*这是我的问题,我不知道这是否好,警告是
格式'%s'需要'char',参数是'**char'。我知道
我不知道如何解决这个问题,但我认为真正的问题是
我这里的代码根本不正确*/
对于(i=0;i目的地);
scanf(“%s\n”和(*map)->方向);
scanf(“%s\n”和(*map)->当前类型);
scanf(“%d\n”和(*map)->没有可用的文件;
}
}

第一个问题是这一行:

map=malloc(max_line * sizeof(MAP) );
这里您需要一个指针数组,因此该行应为:

map=malloc(max_line * sizeof(MAP*) );
                                ^
                               notice
下一个问题是这部分

//Allocating memory for the members of the structure

(*map)->destination=(char)malloc(1 * sizeof(char));
(*map)->direction=(char)malloc(1 * sizeof(char));
(*map)->type_present=(char)malloc(1 * sizeof(char));
这是错误的,有几个原因。首先,您只初始化一个映射,而不是为所有映射进行初始化。此外,当您要存储字符串时,分配一个字符是没有意义的

因此,初始化应该是:

//Allocating memory for the members of the structure
for(i = 0; i < max_line; i++){
{
    for(j = 0; j < max_col; j++){
    {
        map[i][j].destination = malloc(MAX_STRING_LENGTH * sizeof(char));
        map[i][j].direction = malloc(MAX_STRING_LENGTH * sizeof(char));
        map[i][j].type_present = malloc(MAX_STRING_LENGTH * sizeof(char));
    }
}

BTW:<代码> SCANF(%s…./CODE)是不好的,因为用户可以溢出缓冲区。考虑使用<代码> FGES或至少执行<代码> SCANF(“%42s…< /COD>”,其中42是缓冲长度(减1))。.

告诉我一件事-矩阵的每个元素都是struct
MAP
的一个实例?
col
没有初始化。哦,是的,我只是在复制代码时忘了初始化“col”。是的,矩阵的每个元素都是struct MAP的一个实例。@coderredoc对不起,我只是做了我的帐户,我不知道所有的东西,谢谢,我以后会记住的future@MateiCristianNicusor.:好:)所有最好的人都不同意你的固定字符串解决方案。这会浪费大量内存。他可以在阅读时这样做。这也令人怀疑,他想要一个二维数组。我现在明白了,我认为整个字符串只有一个站姿。我一开始试着使用FGET,但我根本无法实现,谢谢你提供的所有提示。@PaulOgilvie-真的……但我不认为OPs关注的是这种优化。@4386427我尝试了你的版本,正如你所说的,现在它说格式“%s”需要“char*”,但参数有“char**”。我真的不知道如何解决这个问题。你能帮我吗?@mateicristianicus-在哪一行?
//Allocating memory for the members of the structure
for(i = 0; i < max_line; i++){
{
    for(j = 0; j < max_col; j++){
    {
        map[i][j].destination = malloc(MAX_STRING_LENGTH * sizeof(char));
        map[i][j].direction = malloc(MAX_STRING_LENGTH * sizeof(char));
        map[i][j].type_present = malloc(MAX_STRING_LENGTH * sizeof(char));
    }
}
scanf("%s\n", map[i][j].destination);