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

여기설명 된대로 이제 프로그램이 올바른 출력을 제공합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++ 포인터에서 배열의 대상 구조체를 포함하여 구조체에 대한 값 읽기

분류에서Dev

FreeRTOS의 대기열을 통해 구조체에 대한 포인터 보내기

분류에서Dev

구조체의 포인터에 대한 포인터 초기화

분류에서Dev

구조체에 대한 포인터 배열을 정렬하기위한 stdlib qsort

분류에서Dev

C ++에서 구조체에 대한 포인터 초기화

분류에서Dev

C에서 구조체의 멤버 인 배열에 대한 포인터 산술

분류에서Dev

구조체 내의 동적 배열에 대한 포인터 C

분류에서Dev

c에 정의 된 구조체에 대한 Swift 정의 이중 포인터

분류에서Dev

구조체 내부에 구조체에 대한 포인터 배열 만들기

분류에서Dev

C의 함수에 구조체 포인터 보내기

분류에서Dev

구조체에 대한 포인터 배열 만들기

분류에서Dev

구조체에 대한 포인터 배열 초기화

분류에서Dev

C 구조체, 구조체에 대한 공용체 포인터

분류에서Dev

구조체의 배열에 대한 포인터

분류에서Dev

C-동적 구조체 배열에 대한 포인터

분류에서Dev

사용자 정의 구조체에 대한 스마트 포인터를위한 멤버 초기화 목록

분류에서Dev

구조체의 포인터에서 배열 가져 오기

분류에서Dev

함수에 전달 된 구조체의 배열에 대한 C 포인터

분류에서Dev

C에서 배열에 대한 포인터 초기화

분류에서Dev

C ++에서 구조 배열에 대한 포인터 문제

분류에서Dev

구조체에 대한 포인터의 고정 배열에 값을 할당하는 방법

분류에서Dev

기존 구조의 배열에서 구조에 대한 포인터를 찾아 반환

분류에서Dev

생성자를 사용하여 정의 된 구조에 대한 포인터 배열 초기화

분류에서Dev

구조체 C ++에 대한 포인터를 사용하여 동적으로 할당 된 배열 만들기

분류에서Dev

c의 구조체에 대한 포인터 sizeof

분류에서Dev

C에서 앞으로 선언 된 구조의 배열에 대한 포인터

분류에서Dev

C의 구조체 내부에서 char 배열에 대한 포인터를 반환합니까?

분류에서Dev

C ++의 구조에 대한 포인터 배열

분류에서Dev

C에서 구조체에 대한 포인터 반환

Related 관련 기사

  1. 1

    C ++ 포인터에서 배열의 대상 구조체를 포함하여 구조체에 대한 값 읽기

  2. 2

    FreeRTOS의 대기열을 통해 구조체에 대한 포인터 보내기

  3. 3

    구조체의 포인터에 대한 포인터 초기화

  4. 4

    구조체에 대한 포인터 배열을 정렬하기위한 stdlib qsort

  5. 5

    C ++에서 구조체에 대한 포인터 초기화

  6. 6

    C에서 구조체의 멤버 인 배열에 대한 포인터 산술

  7. 7

    구조체 내의 동적 배열에 대한 포인터 C

  8. 8

    c에 정의 된 구조체에 대한 Swift 정의 이중 포인터

  9. 9

    구조체 내부에 구조체에 대한 포인터 배열 만들기

  10. 10

    C의 함수에 구조체 포인터 보내기

  11. 11

    구조체에 대한 포인터 배열 만들기

  12. 12

    구조체에 대한 포인터 배열 초기화

  13. 13

    C 구조체, 구조체에 대한 공용체 포인터

  14. 14

    구조체의 배열에 대한 포인터

  15. 15

    C-동적 구조체 배열에 대한 포인터

  16. 16

    사용자 정의 구조체에 대한 스마트 포인터를위한 멤버 초기화 목록

  17. 17

    구조체의 포인터에서 배열 가져 오기

  18. 18

    함수에 전달 된 구조체의 배열에 대한 C 포인터

  19. 19

    C에서 배열에 대한 포인터 초기화

  20. 20

    C ++에서 구조 배열에 대한 포인터 문제

  21. 21

    구조체에 대한 포인터의 고정 배열에 값을 할당하는 방법

  22. 22

    기존 구조의 배열에서 구조에 대한 포인터를 찾아 반환

  23. 23

    생성자를 사용하여 정의 된 구조에 대한 포인터 배열 초기화

  24. 24

    구조체 C ++에 대한 포인터를 사용하여 동적으로 할당 된 배열 만들기

  25. 25

    c의 구조체에 대한 포인터 sizeof

  26. 26

    C에서 앞으로 선언 된 구조의 배열에 대한 포인터

  27. 27

    C의 구조체 내부에서 char 배열에 대한 포인터를 반환합니까?

  28. 28

    C ++의 구조에 대한 포인터 배열

  29. 29

    C에서 구조체에 대한 포인터 반환

뜨겁다태그

보관