A sentimental robot

구조체의 포인터멤버변수 동적메모리할당 본문

C

구조체의 포인터멤버변수 동적메모리할당

GOD03219 2018. 1. 2. 11:30

#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)

void memoryalloc(struct score**pp);
void input(struct score*p);
void oper(struct score*p);
void output(struct score*p);
void del(struct score*p);
int num;
int i;
struct score
{
 char *name;
 int *kor;
 int *eng;
 int *mat;
 int *total;
 float *avg;

};

void main()
{
 
 struct score *p;
 
 memoryalloc(&p);
 input(p);
 oper(p);
 output(p);
 del(p);


}
void memoryalloc(struct score**pp)
{
 printf("몇 명? :");
 scanf("%d", &num);
 

 *pp = (struct score*)calloc(num, sizeof(struct score));


 for(i=0 ; i<num ; i++)
 {
  (*pp+i)->name = (char*)calloc(10,sizeof(char));     // 구조체struct score가 num개 생길때, i번째 구조체의 멤버변수 name의 주소값에 동적메모리 할당
  (*pp+i)->kor=(int*)calloc(1,sizeof(int));
  (*pp+i)->eng=(int*)calloc(1,sizeof(int));
  (*pp+i)->mat=(int*)calloc(1,sizeof(int));
  (*pp+i)->total=(int*)calloc(1,sizeof(int));
  (*pp+i)->avg=(float*)calloc(1,sizeof(float));
 }


}


void input(struct score*p)
{

 for (i = 0; i < num; i++)
 {
  printf("name input:");
  scanf("%s", (p+i)->name);
  printf("kor input:");
  scanf("%d", (p+i) ->kor);
  printf("eng input:");
  scanf("%d",(p+i)->eng);
  printf("mat input:");
  scanf("%d",(p+i)->mat);

 }
}


void oper(struct score*p)

 for(i=0 ; i<num ; i++)
 {
  *((p+i)->total) = *((p+i) ->kor) + *((p+i)->eng) + *((p+i)->mat);
  *((p+i)->avg)=*((p+i)->total)/3.f;
 }
}


void output(struct score*p)
{
 for (i = 0; i < num; i++)
 {
  printf("%s\t", (p+i)->name);
  printf("%d\t", *((p+i) ->kor));
  printf("%d\t", *((p+i)->eng));
  printf("%d\t", *((p+i)->mat));
  printf("%d\t", *((p+i)->total));
  printf("%f\n",*((p+i)->avg));

 }

}


void del(struct score*p)
{  

 int i;

 for(i=0 ; i<num ; i++)
 {
  free((p+i)->name);         // 주소값으로 동적메모리 해제, C는 자바와 달리 garbage collection가 없기 때문에 동적메모리를 해제시켜줘야 한다. 
  free((p+i) ->kor);
  free((p+i)->eng);
  free((p+i)->mat);
  free((p+i)->total);
  free((p+i)->avg);
 }
 
 free(p);            // 구조체 포인터 먼저 해제시키면 그 안의 멤버변수를 해제할 수 없기 때문에 멤버변수 먼저 해제


}








#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)
int num;
int i;
void callocCalling(struct a**pp);
void input(struct a *p);
void oper(struct a *p);
void output(struct a*p);
void del(struct a *p);
struct a {

 char * name;
 int *kor;
 int *eng;
 int *mat;
 int *total;
 float *avg;

};

void main() {


 struct a * p;


 callocCalling(&p);
 input(p);
 oper(p);
 output(p);
 del(p);


}
void callocCalling(struct a **pp) {


 printf("how many?");
 scanf("%d", &num);
 *pp = (struct a*)calloc(num, sizeof(struct a));


 //num 만큼 생성된 구조체 안의 멤버변수를 동적할당 해주기
 for (i = 0 ; i < num ; i++) {


  (*pp)[i].name = (char *)calloc(10, sizeof(char));
  (*pp)[i].kor = (int *)calloc(1, sizeof(int));
  (*pp)[i].eng = (int *)calloc(1, sizeof(int));
  (*pp)[i].mat = (int *)calloc(1, sizeof(int));
  (*pp)[i].total = (int *)calloc(1, sizeof(int));
  (*pp)[i].avg = (float *)calloc(1, sizeof(float));


 }


}


void input(struct a *p) {


 for (i = 0 ; i < num ; i++) {
  printf("Name input :");
  scanf("%s", p[i].name);
  printf("Korean :");
  scanf("%d", p[i].kor);
  printf("English :");
  scanf("%d", p[i].eng);
  printf("Math :");
  scanf("%d", p[i].mat);


 }


}

void oper(struct a *p) {


 for (i = 0; i < num; i++) {
  *(p[i].total) = *(p[i].kor) + *(p[i].eng) + *(p[i].mat);
  *(p[i].avg) = *(p[i].total) / 3.f;

 }

}


void output(struct a *p) {


 for (i = 0; i < num; i++) {
  printf("%s\t%d\t%d\t%d\t%d\t%f\n", p[i].name, *(p[i].kor), *(p[i].eng), *(p[i].mat), *(p[i].total), *(p[i].avg));


 }

}


void del(struct a *p) {


 for (i = 0; i < num; i++) {


  free(p[i].name);
  free(p[i].kor);
  free(p[i].eng);
  free(p[i].mat);
  free(p[i].total);
  free(p[i].avg);


 }


 free(p);


}

'C ' 카테고리의 다른 글

const int *p  (0) 2018.01.02
const  (0) 2018.01.02
동적메모리할당함수 호출하기(방법2 : 더블 포인터를 이용한 call by address)  (0) 2017.12.29
동적메모리할당함수 호출하기(방법1)  (0) 2017.12.29
3차원배열  (0) 2017.12.29