[운영체제실무] 동적 메모리 할당 / 임시파일

📌 동적 메모리 할당

  • 프로그램 실행하면서 필요에 따라 데이터를 저장할 수 있는 메모리를 할당
  • 동적 메모리 할당/해제
    • void*malloc(size_t size)
      • size 바이트의 메모리 할당함
      • 메모리 할당이 성공하면 할당한 블록 포인터를 반환하고 실패하면 NULL 포인터를 반환
    • void free(void *ptr)
      • 동적으로 할당된 메모리를 반납
    • void *calloc(size_t nelem, size_t elsize)
      • 배열과 같이 연속된 elsize의 크기로 nelem개의 동적 메모리 할당
      • 메모리를 모두 0으로 초기화(malloc 함수는 0으로 초기화하지 않음)
    • void realloc(void prt, size_t size)
      • 매개변수 ptr은 malloc, calloc, realloc 함수에서 리턴한 메모리 영역을 가리키는 포인터
      • size는 새롭게 추가한 메모리 바이트 수
      • 매개변수 ptr이 가리키는 이전 메모리 영역의 내용을 새롭게 할당한 메모리 영역에 복사

✍ 실습

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

int main(int argc, char* argv[]) {
	int i;
	int n;
	int j;
	int* prime_arr;

	if (argc < 2) {
		printf("prime input\n");
		exit(0);
	}

	n = atoi(argv[1]);

	prime_arr = (int*)malloc(sizeof(int) * n);

	if (n <= 1) {
		printf("input great than 2\n");
		exit(0);
	}

	for (i = 2; i < n; i++)
		prime_arr[i] = 1;

	for (i = 2; i * i <= n; i++) {
		if (prime_arr[i])
			for (j = i * i; j <= n; j += i)
				prime_arr[j] = 0;
	}
	
	for (i = 2; i <= n; i++)
		if (prime_arr[i])
			printf("%d ", i);

	printf("\n");

	return 0;
}

✍ 입력

10

💻 출력

2 3 5 7 //소수

📌 임시파일

  • 프로그램이 임시 파일을 만들 때 다른 프로그램이 사용하지 않는 파일명 만듦
  • stdlib.h 를 포함
  • char mktemp(char templeate)
    • template는 임시 파일명
    • 파일 이름에는 여섯 개의 x를 포함시킴
    • x에는 프로세스 번호와 같은 문자로 채워짐
    • 파일명을 만들지 못하면 빈 문자열을 반환
    • 저수준 입출력 사용시 mkstemp

✍ 실습

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

int main() {
	char* tempf;
	char* template;
	FILE* fp;

	strcpy(template, "./tempXXXXXX");

	tempf = mktemp(template);

	if (strlen(tempf) == 0) { //파일을 만들지 못하면
		perror("cannot make %s");
		exit(1);
	}

	fp = fopen(tempf, "w");
	fprintf(fp, "Hello");
}

📌 문자열 숫자 변환

  • 문자열을 정수로 변환
    • int atoi(const char str) : str로 입력된 문자열을 정수(int형)로 변환
      -long atol(const char
      str) : str로 입력된 문자열을 정수 (long형)로 변환
    • double atof(const char *str): str로 입력된 문자열을 실수(double형)로 변환
    • long strtol(const char *str, char **ptr, int base) : str로 입력된 문자열을 정수(long형)로 변환, 단 str이 여러 숫자로 표시된 문자열일 경우 반복하여 숫자로 변환
      • str의 문자열을 base로 나온 숫자로 변경함
      • str이 base와 맞지 않는 숫자가 나오면 무시함
    • unsigned long strtoul(const char *str, char **ptr, int base) : str로 입력된 문자열을 양의 정수(unsinged long형)로 변환
    • double strtod(const char *str, char **prt) : str로 입력된 실수문자열을 실수(double형)로 변환

좋은 웹페이지 즐겨찾기