[英]Getting information from an array of pointers to structs in C
所以我正在為學校的作業編寫這段代碼,我必須做的是在編寫它們時有兩個函數, createMonster
返回一個帶有數據的動態分配的怪物,而readMonsters
返回一個指向怪物的指針數組在createMonster
。 我一直無法理解如何讓函數和結構合作,這就是我到目前為止所擁有的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct monster {
int id;
char *name;
char *element;
int population;
} monster;
monster* createMonster(char *name, char *element, int population)
{
monster *amonster = (monster*)malloc(sizeof(monster));
amonster->name = (char*)malloc(sizeof(char)*sizeof(name));
amonster->element = (char*)malloc(sizeof(char)*sizeof(element));
amonster->population = (int)malloc(sizeof(int)*sizeof(population));
amonster->name = name;
amonster->element = element;
amonster->population = population;
return amonster;
}
monster** readMonsters(FILE* infile, int *monsterCount)
{
char n[15], e[15];
int p;
monster **a_array = malloc(*monsterCount * sizeof(struct a*));
for (int i = 0; i < *monsterCount; i++) {
a_array[i] = malloc(sizeof(monster));
fscanf(infile,"%s %s %d",n, e, &p);
printf("%s %s %d\n", n, e, p);
a_array[i] = createMonster(n,e,p);
}
monster ***m = &a_array;
return *m;
}
int main(){
int monsterCount;
char name[15];
FILE *fp = fopen ( "in.txt", "r" );
fscanf(fp,"%d %s",&monsterCount,name);
//printf("test %d\n",monsterCount);
monster **mptr = readMonsters(fp,&monsterCount);
printf("%s %s %d\n", (mptr)[3]->name,(mptr)[3]->element,(mptr)[3]->population);
fclose(fp);
return 0;
}
輸入文件為:
8 monsters
StAugustine Grass 12
Zoysia Grass 8
WholeWheat Bread 6
MultiGrain Bread 10
Rye Bread 10
Cinnamon Spice 5
Pepper Spice 10
Pumpkin Spice 30
但是,當我運行它時,我可以看到它在第一次制作它們時有效,但是當我嘗試返回訪問數據時,它返回字符串的垃圾,這是我的輸出:
StAugustine Grass 12
Zoysia Grass 8
WholeWheat Bread 6
MultiGrain Bread 10
Rye Bread 10
Cinnamon Spice 5
Pepper Spice 10
Pumpkin Spice 30
`7 w├?]╨@ 10
w├?]╨@ 10
我嘗試重新排列函數、指針等,並嘗試了這些函數的許多不同版本,試圖按照在線指南進行操作,但每次它要么根本不工作,要么返回垃圾。 我正在尋找任何幫助來理解如何使其工作或如何更好地組織它,因為我很容易承認我對 C 的經驗充其量是中等的。
您發布的代碼存在以下問題:
線
amonster->name = (char*)malloc(sizeof(char)*sizeof(name));
沒有意義。 sizeof(name)
是指針的大小,它是 32 位還是 64 位,具體取決於您的平台。 但是,您可能需要分配更多。 您需要分配strlen(name) + 1
個字節,因為這是傳遞給函數的字符串的長度(包括空終止字符)。 這同樣適用於下一行:
amonster->element = (char*)malloc(sizeof(char)*sizeof(element));
此外,該行
amonster->population = (int)malloc(sizeof(int)*sizeof(population));
沒有意義,因為amonster->population
不是指針。 為什么要在其中存儲指向動態分配內存的指針? 你不應該在這里需要動態內存分配,因為amonster->population
不是一個字符串,而是一個固定長度的變量,你已經為其分配了空間,因為它是struct
一部分。 因此,您可以刪除此行。 你只需要一行amonster->population = population;
,您已經擁有。
此外,該行
amonster->name = name;
不做你想做的。 它不復制字符串,它只復制指針,即內存地址。 這樣,當您返回到函數main
時,您正在復制一個指針,該指針將成為一個懸空指針。 為了復制實際的字符串,您必須編寫strcpy( amonster->name, name );
. 這同樣適用於以下行:
amonster->element = element;
線
a_array[i] = malloc(sizeof(monster));
是不必要的,只會造成內存泄漏。 您已經為函數createMonster
中的所有結構分配了空間。
線條
monster ***m = &a_array;
return *m;
不必要的麻煩,可以簡化為以下內容:
return a_array;
應用所有這些修復后,您的代碼應如下所示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct monster {
int id;
char *name;
char *element;
int population;
} monster;
monster* createMonster(char *name, char *element, int population)
{
monster *amonster = (monster*)malloc(sizeof(monster));
amonster->name = (char*)malloc(sizeof(char)*(strlen(name)+1)); //fixed
amonster->element = (char*)malloc(sizeof(char)*(strlen(element)+1)); //fixed
//amonster->population = (int)malloc(sizeof(int)*sizeof(population)); //redundant
strcpy( amonster->name, name ); //fixed
strcpy( amonster->element, element ); //fixed
amonster->population = population;
return amonster;
}
monster** readMonsters(FILE* infile, int *monsterCount)
{
char n[15], e[15];
int p;
monster **a_array = malloc(*monsterCount * sizeof(struct a*)); //what is struct a???
for (int i = 0; i < *monsterCount; i++) {
//a_array[i] = malloc(sizeof(monster)); //redundant
fscanf(infile,"%s %s %d",n, e, &p);
printf("%s %s %d\n", n, e, p);
a_array[i] = createMonster(n,e,p);
}
//monster ***m = &a_array; //removed
//return *m; //removed
return a_array;
}
int main(){
int monsterCount;
char name[15];
FILE *fp = fopen ( "in.txt", "r" );
fscanf(fp,"%d %s",&monsterCount,name);
//printf("test %d\n",monsterCount);
monster **mptr = readMonsters(fp,&monsterCount);
printf("%s %s %d\n", (mptr)[3]->name,(mptr)[3]->element,(mptr)[3]->population);
fclose(fp);
return 0;
}
這表現在這里,你的程序現在提供正確的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.