일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- mac terminal command
- border-box
- 토큰경제
- 하이퍼레저패브릭
- #1차원배열
- #자바상속#자바이즈어#is~a
- html charset
- relative path
- #CallByAddress
- docker example
- html id
- #android activity
- html youtube
- html multimedia
- #C++ 연산자함수오버로딩
- #다차원포인터
- #JAVASCRIPT
- html object
- #bubbleSort
- html5 new tag
- #3차원배열
- hyperledger transaction
- #성적관리프로그램
- #C++ has~a
- html plug-in
- html video
- #2차원배열
- git flow
- html code
- #binary
- Today
- Total
A sentimental robot
구조체의 포인터멤버변수 동적메모리할당 본문
#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 |