힙 영역 : 사용자가 원하는 시점에 변수를 할당/소멸 하도록 지원. '프로그래머가 관리하는 메모리 공간'이라고도 하는데, malloc 함수 호출로 할당된 메모리 공간은 프로그래머가 직접 free 함수 호출을 통해 해제하지 않으면 계속 남아있다.

지역변수와 같이 함수가 호출될 때마다 매번 할당이 이뤄지지만, 할당이 되면 전역변수와 마찬가지로 함수를 빠져나가도 소멸되지 않는 성격의 변수가 필요. 힙에 할당된 메모리 공간은 포인터 변수를 이용해서 접근해야 한다. 주소 값을 반환하기 때문.


힙 영역의 메모리 공간 할당과 해제 : malloc, free 함수

1
2
3
4
#include <stdlib.h>
 
void * malloc (size_t size);
void free (void * ptr);


malloc 함수는 성공 시 할당된 메모리의 주소 값 반환, 실패 시 NULL 반환


malloc 함수의 반환형은 void * 형이므로 반환값에 아무런 가공도 하지 않으면 할당된 메모리 공간에 접근 불가능.

malloc 함수는 원하는 만큼 메모리 공간 할당하고, 그 메모리의 주소 값 반환. 사용하려면 포인터 형의 변환을 통해 결정해야 함.

형변환 연산자를 사용하여 int * ptr1 = (int *)malloc(sizeof(int)); 이런 식으로 형변환을 해줘야 할당된 메모리 공간에 접근 가능.


힙 영역의 메모리 공간 할당 함수 : calloc 함수 (메모리 공간 해제시 free)

1
2
3
#include <stdlib.h>
 
void * calloc (size_t elt_count, size_t elt_size);


성공 시 할당된 메모리의 주소값, 실패 시 NULL 반환

elt_count 인자 : 할당할 블록의 개수 정보

elt_size 인자 : 블록 하나당 바이트 크기의 정보

malloc 함수와 차이점 : malloc는 할당된 메모리 공간을 별도의 값으로 초기화하지 않음(할당된 메모리 공간이 쓰레기 값으로 채워짐), calloc는 할당된 메모리 공간의 모든 비트를 0으로 초기화 시킴.


힙에 할당된 메모리 공간 확장 시 호출하는 realloc 함수

할당된 메모리 공간은 크기를 확장할 수 없지만, 그 영역이 heap이라면 가능하다.

1
2
3
#include <stdio.h>
 
void * realloc (void * ptr, size_t size);


성공 시 새로 할당된 메모리의 주소 값, 실패 시 NULL 반환

ptr : 확장하고자 하는 힙 메모리의 시작 주소 값

size : 확장하고자 하는 메모리의 전체 크기

1. malloc 함수의 반환 값(주소값)과 realloc 함수의 반환 값이 같은 경우

=> 기존에 할당된 메모리 공간의 뒤를 이어서 확장할 영역이 넉넉한 경우

2. malloc 함수의 반환 값과 realloc 함수의 반환 값이 다른 경우

=> 넉넉하지 않은 경우 힙의 다른 위치에 새로 할당(이전 배열에 저장된 값 복사)

'언어 > C' 카테고리의 다른 글

typedef  (0) 2016.05.02
static 변수  (0) 2016.03.21
파일 입출력 -3  (0) 2016.03.18
파일 입출력 -2  (0) 2016.03.13
파일 입출력 -1  (0) 2016.03.10
Posted by 知彼知己百戰不殆
,

파일 입출력 -3

언어/C 2016. 3. 18. 00:45

텍스트와 바이너리 데이터의 집합체인 구조체 변수의 입출력

⇒ 구조체 변수를 하나의 바이너리 데이터로 인식하고 처리

ex)

fp=fopen("friend.bin", "wb");

printf("이름, 성별, 나이 순 입력: ");

scanf("%s %c %d", myfren1.name, &(myfren1.sex), &(myfren1.age));

fwrite((void *)&myfren1, sizeof(myfren1), 1, fp);

fclose(fp);


fp=fopen(~~~);

fread((void*)&myfren2, sizeof(myfren2), 1, fp);

printf("%s %c %d \n", myfren2.name, myfren2.sex, myfren2.age);

fclose(fp);


파일 위치 지시자 : 파일이 처음 개방되면 무조건 파일의 맨 앞부분 가리킴

1
2
3
#include <stdio.h>
 
int fseek(FILE * stream, long offset, int wherefrom);


파일 위치 지시자의 이동 : seek (stream으로 전달된 파일 위치 지시자를 wherefrom에서부터 offset 바이트만큼 이동)ㅁ

성공시 0, 실패시 0이 아닌 값 반환

 매개변수 wherefrom 이...

파일 위치 지시자는... 

SEEK_SET(0) 이라면

파일 맨 앞에서부터 이동을 시작 

SEEK_CUR(1) 이라면

현재 위치에서부터 이동을 시작

SEEK_END(2) 이라면

파일 맨 끝에서부터 이동을 시작

파일의 맨 끝은 마지막 데이터가 아니라 EOF를 의미

매개변수 offset에 양의 정수 전달 : 파일의 마지막을 향해서 파일 위치 지시자 이동

음의 정수 전달 : 파일의 시작 위치를 향해서 파일 위치 지시자 이동


현재 파일 위치 지시자의 위치 : ftell

1
2
3
#include <stdio.h>
 
long ftell(FILE * stream);


가장 앞 부분의 바이트 위치를 0으로 간주


'언어 > C' 카테고리의 다른 글

static 변수  (0) 2016.03.21
메모리 관리와 메모리의 동적 할당  (0) 2016.03.20
파일 입출력 -2  (0) 2016.03.13
파일 입출력 -1  (0) 2016.03.10
구조체 기초 (열거형 enum)  (0) 2016.03.10
Posted by 知彼知己百戰不殆
,

파일 입출력 -2

언어/C 2016. 3. 13. 23:53

파일의 개방 모드 (웬만하면 r,w,a 중에서 선택)

모드 

 스트림의 성격

일이 없을 경우 

 r

 읽기 가능

Error 

 w

 쓰기 가능

생성 

 a

 파일 끝에 덧붙여 쓰기 가능

 r+

 읽기/쓰기 가능

Error 

 w+

 읽기/쓰기 가능

생성 

 a+

 읽기/덧붙여 쓰기 가능

생성

1. 모드의 +는 읽기, 쓰기가 모두 가능한 스트림의 형성을 의미

2. 모드의 a는 쓰기(덧붙이기)가 가능한 스트림 형성


윈도우(\r\n), UNIX(\n), Mac(\r) 계열마다 파일 내 개행이 다르므로 형태 변환을 시켜줘야 한다.

형태 변환은 파일을 텍스트 모드(fopen사용시)로 개방하면 자동으로 됨.

C프로그램에서 \n을 파일에 저장하면 윈도우에서는 \r\n으로 변환되어 저장됨.


텍스트 모드의 파일 개방을 위해서는 fopen 함수의 두 번째 인자로 다음 중 하나 전달

rt, wt, at, r+t(rt+), w+t(wt+), a+t(at+)

바이너리 데이터를 저장하고 있는 파일의 경우 형태의 변환이 일어나면 안되므로 바이너리 모드로 파일 개방.

rb, wb, ab, r+b(rb+), w+b(wb+), a+b(ab+)

개방 모드에 아무것도 붙이지 않으면 디폴트 값은 텍스트 모드


feof함수 : 파일의 끝 확인할 때 사용

1
2
3
#include <stdio.h>
 
int feof(FILE * stream);


파일의 끝에 도달한 경우 0이 아닌 값 반환

한 파일에서 다른 파일로 복사를 할 때 완전하게 파일 끝까지 복사가 다 됐는지 확인할 때 사용

fgetc나 fgets함수가 EOF를 반환했다고 해서 무조건 파일의 끝에 도달했다고 판단할 수 없다. 오류가 발생하는 경우에도 EOF가 반환


바이너리 데이터의 입출력 fread, fwrite

1
2
3
#include <stdio.h>
 
size_t fread(void * buffer, size_t size, size_t count, FILE * stream);


 성공시 전달인자 count, 실패 또는 파일의 끝 도달 시 count보다 작은 값 반환


1
2
3
#include <stdio.h>
 
size_t fwrite(void * buffer, size_t size, size_t count, FILE * stream);


성공시 전달인자 count, 실패 시 count보다 작은 값 반환

만약 fwrite((void*)but, sizeof(int), 12, fp) 이렇게 함수가 정의돼 있다면 한 번 호출할 때마다 12만큼씩 데이터를 써라..라는 뜻.. 최소 12만큼 쓰는게 아니라 그냥 무조건 12만큼 써라 라는 뜻


서식에 따른 데이터 입출력 : fprintf, fscanf

printf와 scanf 함수와 비슷, 입출력 대상이 콘솔이 아닌 파일

ex) char name[10]="홍길동";

char sex='M';

int age = 24;

fprintf(fp, "%s %c %d", name, sex, age); fp는 파일 구조체 포인터


fscanf : 첫 번째 인자로 전달된 포인터가 지칭하는 파일로부터 데이터를 읽어들임   

ex) char name[10];

char sex ;

int age;

fscanf(fp, "%s %c %d", name, &sex, &age);

'언어 > C' 카테고리의 다른 글

메모리 관리와 메모리의 동적 할당  (0) 2016.03.20
파일 입출력 -3  (0) 2016.03.18
파일 입출력 -1  (0) 2016.03.10
구조체 기초 (열거형 enum)  (0) 2016.03.10
구조체 기초 (union, struct의 차이)  (0) 2016.03.07
Posted by 知彼知己百戰不殆
,