
1️⃣ 코드 영역
실행할 프로그램의 코드가 저장되는 메모리 공간
2️⃣ 데이터 영역
전역 변수와 static 변수가 할당되는 영역.
프로그램 시작과 동시에 메모리에 할당되고,
프로그램 종료 시까지 남아있음.
3️⃣ 스택 영역
지역변수와 매개변수가 할당되는 영역.
함수를 벗어날 때 소멸한다.
4️⃣ 힙 영역
동적 할당된 메모리들이 존재하는 공간
📌메모리 할당하는 방법
1️⃣ 정적 메모리 할당
변수 선언
장점은 메모리 누수를 걱정하지 않아도 된다
단점은 메모리 공간의 크기가 정해져 있어서,
더 큰 공간이 필요하더라도
추가해줄 수 없고,
반대로 더 작은 공간이 필요한 경우
메모리 공간의 낭비가 발생
2️⃣ 동적 메모리 할당
실행 단계에서 메모리 공간을 할당
free 함수를 통해,
동적 할당된 기억 공간을 반환해야 함
동적 메모리 할당에선 위처럼
지정된 메모리 크기를 줄 수 있음
✔ calloc 함수
#include <stdlib.h>
void* calloc ( size_t n, size_t byte );
byte 사이즈 크기의 변수를 n개만큼 저장할 수 있는
메모리 공간을 할당 해 달라는 말
calloc는 malloc로 대체할 수 있다.
✔ realloc 함수
ealloc 함수는 이미 할당된 공간의 크기를 바꿀 때, realoc 함수를 사용
#include <stdlib.h>
void* realloc(void* mem, size_t size);
⭐ 정리하기 ⭐
✔ 정적 메모리 할당: 변수 선언을 통해 필요한 메모리 확보
장점: 메모리 누수를 걱정할 필요가 없다.
단점: 메모리 낭비가 발생한다.
✔ 동적 메모리 할당: 실행 단계에서 메모리 공간을 할당받는 것
장점: 메모리 낭비를 없앨 수 있다.
단점: 메모리 누수를 걱정해야 한다.
✅ 오늘의 문제 : 점수의 평균 구하기
학생의 수를 입력받은 뒤, 그 수만큼 학생의 점수를 입력받아
평균을 구하는 프로그램을 작성해보세요.
잘못된 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char tmp[30];
char* str[3]; // 포인터배열 선언
int std = 0;
printf("학생의 수 : ");
scanf("%d", &std);
for (int i = 0; i < std; i++)
{
printf("문자열을 입력하세요.");
gets(tmp);
str[i] = (char*)malloc(strlen(tmp) + 1); // 동적 할당
strcpy(str[i], tmp);
}
for (int i = 0; i < std; i++)
{
printf("%s\n", str[i]);
free(str[i]); // 메모리 반환
}
return 0;
}
사실 이거는 학습 내용에
있는 코드를 복사해와서
수정을 통한 완성을 노린 것이나
좀 다른 코드를 복사해와서
실패!
헤헷;;;
다시 도전!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int* arr;
int std;
int avg = 0, sum = 0;
printf("학생의 수 :");
scanf_s("%d", &std);
printf("\n");
arr = (int*)malloc(sizeof(int) * std);
//arr = (int*)calloc(std, sizeof(int));
for (int i = 1; i <= std; i++)
{
arr[i] = i;
printf("학생 %d :", i);
scanf_s("%d\n", &arr[i]);
sum += arr[i];
}
avg = sum / std;
printf("평균 : %d", avg);
free(arr);
//return 0;
}
여기까지 작성 했으나

[문제점]
1. 이상하게 두번째 학생 입력값을
받을 때는 "학생 x : " 가 안나옴ㅎㅜ
2. 오류 박스
[해결]
1.
free(arr);를 삭제하니
해결
( -> 임시 해결!!!)
2.
scanf("%d\n", &arr[i]);
에서 %d 뒤에 \n 때문이었다...
왜,, 첫번째 턴에서만
두번 입력을 받은건지
모르겠으나...
(다른 턴에서도 두번씩 입력 받으면
눈치 챘을텐데!
아마 첫번째 턴이라서
두번 입력 받은거 같긴 함)
\n을 없애니 해결되었다. 😂
이 오류를 해결하고 나서
다시 free(arr);를
추가하니
오류가 발생하지 않는다!
✔ 해결 중 새롭게 발견한 사실
scanf_s를 쓴거는
scanf가 오류가 발생한다고
대신 쓰라는 알람을 보고였는데
코드 맨 첫 줄에
#define _CRT_SECURE_NO_WARNINGS
또는,
#pragma warnings(disable: 4996)
를 추가하면 오류 없이 사용 가능하다.
그냥 scanf_s를 쓸 수 도있겠지만
호환성 등의 문제가 있으니
저 코드를 추가하여 사용하도록 해야겠다!
그렇게 완성된 최종 코드!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
int main(void)
{
int std;
int* arr;
int avg = 0, sum = 0;
printf("학생의 수 :");
scanf("%d", &std);
printf("\n");
arr = (int*)malloc(sizeof(int) * std);
//arr = (int*)calloc(std, sizeof(int));
for (int i = 0; i < std; i++)
{
//arr[i] = i;
printf("학생 %d :", i+1);
scanf("%d", &arr[i]);
sum += arr[i];
}
free(arr);
avg = sum / std;
printf("평균 : %d", avg);
return;
}
[결과]
짝짝짝~!

'STUDY > C' 카테고리의 다른 글
[모각코 C언어 메이트 심화편] 동적 메모리 할당 | 응용문제 : 소수 갯수 출력하기 (1) | 2022.02.24 |
---|---|
[모각코 C언어 메이트 심화편] 문자열 함수 | 버퍼 | 문자열 길이 비교 (0) | 2022.02.24 |
[모각코 C언어 메이트 심화편] 함수 포인터 | 사칙연산 계산기 만들기 (1) | 2022.02.24 |
[모각코 C언어 메이트 심화편] 도전 문제 | 2차원 배열과 이중포인터 (0) | 2022.02.24 |
[모각코 C언어 메이트 심화편] 이중 포인터 | 최댓값 구하기 (1) | 2022.02.24 |