구조체의 포인터멤버변수 동적메모리할당
#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);
}