programming/c,c++

이것이 C언어다::16장

krystalS2ee 2020. 3. 26. 02:17

16.1장 동적 할당 함수

 

연습문제1
1.  double *weight=  (double *) malloc(sizeof(double));
    int *scores=     (int *)malloc(10*sizeof(int));
    char*string=     (char*)malloc(80*sizeof(char));
2.
(max==NULL)
free(max);

3.
#include<stdio.h>
#include<stdlib.h>

int main()
{
 double *high;
 double  *low;


 high = (double *)malloc(sizeof(double));
 low = (double *)malloc(sizeof(double));
 if ((high==NULL)||(low==NULL))
 {
  printf("#으로 메모리가 부족합니다\n");
  exit(1);
 }
 printf("최고기온과 최저기온을 입력하세요: ");
 scanf("%lf %lf", high, low);
 printf("일교차는 %.1lf도 입니다.\n", *high - *low);
 free(high);
 free(low);
 
 return 0;
}

 

 


4. pa (20byte)

5.
#include<stdio.h>
#include<stdlib.h>
int main()
{
 char *ps,*pt;
 char temp[32];
 int len = 1;

 

 ps = (char*)calloc(len,sizeof(char));
 while (1)
 {
  printf("메모 입력:");
  fgets(temp, sizeof(temp), stdin);
  temp[strlen(temp) - 1] = '\0';
  
  if (strcmp(temp, "end") == 0) break;
  len += strlen(temp) + 1;//***
  pt = (char*)realloc(ps, len);
  if (pt == NULL)
  {
   printf("메모리가 부족합니다.\n");
   break;
  }

  ps = pt;
  strcat(ps, temp);
  strcat(ps, " ");

 }
 printf("%s\n", ps);
 free(ps);

 return 0;
}

 

 

 

추가문제


1. 정적 할당과 동적 할당의 차이를 설명하시오. 동적 할당의 장점은 무엇인가?


-정적 할당: 변수선언, 배열선언, 객체선언을 통해 메모리를 확보하는 방법으로, 코딩중에 미리 필요한 메모리를 예상해서 확보한다. 스택영역에 할당되어 함수가 종료되거나 변수 영역을 벗어나면 자동으로 공간이 해제된다.
-동적 할당: 프로세스가 실행과정 중에 필요한 메모리를 운영체제에 요구해 할당 또는 해제가능하다.
-동적 할당의 장점 : 상황에 따라 원하는 크기만큼의 메모리가 할당되고, 이미 할당된 메모리도 크기변경이 언제든 가능하므로 경제적이다.(유동적인 데이터관리)

 

 

2. void 포인터를 설명하시오.(15장 475페이지 참고할 것)
-가리키는 자료형이 정해지지 않은 포인터이다. void는 가리키는 자료형을 결정하지 않겠다는 뜻이므로, 모든 주소를 저장할 수 있지만 간접참조 연산이나 정수연산은 불가능하다

 

3. malloc함수의 반환형이 void *이므로 반드시 형 변환하여 사용해야한다. 이유를 설명하시오.
-malloc 함수는 확보된 기억공간이 어떤 용도로 사용될지 알 수 없으므로 void * 형태로 리턴하는데, 이 포인터를 사용할 때는 용도에 맞게 형변환을 해주어야 한다.
(나중에 메모리에 접근할 때 얼마만큼의 메모리를 읽을 것인지를 판단하기 위해서이다. 예를 들어 int*의 경우 메모리 참조를 할 때 메모리 영역을 4byte만큼만 읽는다.)


4. free함수로 메모리를 해제하지 않으면 어떻게 되는가?
-프로그램이 실행되는 동안에는 할당된 메모리가 사용되지 않는 중에도 계속 남아있게 된다.


5. 힙과 스택 영역에 대하여 설명하시오.
-힙: 동적으로 할당하는 메모리 공간.
-스택: 함수 호출시 생성되는 지역변수와 매개변수가 저장되는 영역. 함수 호출이 완료되면 사라짐.

 

6. 문자열을 입력 받고 저장한 후 화면에 출력해주는 프로그램을 작성하고자 한다. 문자열의 크기를 미리 알 수 없으므로 먼저 사용자로부터 문자열 크기를 입력받아 필요한 메모리를 동적 할당 후 문자열을 저장하도록 프로그램을 작성하시오.

 

#include<stdio.h>
#include<stdlib.h>
int main()
{
 char *str;
 int len;

 printf("입력받을 문자열 갯수(공백포함): ");
 scanf("%d", &len);
 str = (char*)malloc(len*sizeof(char) + 1);
 printf("문자열 입력(글자수: %d):", len );
 fflush(stdin);
 fgets(str, len + 1 , stdin);
 if (str == NULL)
 {
  printf("#으로 메모리가 부족합니다\n");
  exit(1);
 }
 printf("%s\n", str);
 free(str);

 return 0;
}