簡體   English   中英

從指向 C 中結構的指針數組中獲取信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM