malloc은 heap의 메모리 공간을 사용하기 위해 내가 필요한 만큼 필요한 자료형으로 메모리를 예약할수 있습니다. calloc은 이렇게 할당받은 메모리를 0으로 초기화해줍니다. realloc을 사용하면 크기를 새로 할당할 수 있는데, 이 때 새로운 크기의 메모리를 다시 heap에서 할당받아 기존 메모리에서 복사해온 다음, 기존 메모리를 free시켜 줍니다.
7.
&연산자를 통해 그 변수의 주소값을 얻어올 수 있습니다. *연산자를 통해 그 변수가 가리키고 있는 주소의 값을 참조해올 수 있습니다.
int a = 4;
&a = a의 메모리상의 주소값
*&a = a의 메모리상의 주소값이 가리키고 있는 값을 참조해옴. 즉, 4.
8.
0x102
0x104
0x014
0x8E4
0x113
9. 코드를 잘 짜야합니다... free된 포인터를 다시 free하면 에러가 발생합니다.
10. %d, %c
11.valid합니다.
output이 static 변수이므로, data segment에 존재합니다.
12.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <assert.h>
void swap(char *a, char *b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
return ;
}
int main()
{
int fd;
int flag = 0;
fd = open("text.txt", O_RDONLY);
int read_len=0;
char buf[41];
while(1)
{
read_len = read(fd, buf, 40);
if(read_len == 0)
break;
else if(read_len == 40)
buf[read_len] = '\0';
else if(read_len > 0 && read_len <40)
{
buf[read_len] = '\0';
--read_len;
}
if( 0 == flag )
{
printf(" NORMAL print : %s\n", buf);
flag = 1-flag;
}
else if( 1 == flag )
{
int i = 0;
for(i = 0 ; i<(read_len/2) ; i++)
{
swap(&buf[i], &buf[read_len-1-i]);
}
printf("INVERSE print : %s\n", buf);
flag = 1-flag;
}
else
{
assert(flag == 0 || flag == 1);
}
}
close(fd);
return 0;
}
13. 잘 모르겠습니당...
C의 FILE에서 사용하는 라이브러리 함수인 fopen, fread, fwrite, fclose는 대부분 POSIX API인 open/read/write/close등을 사용합니다.
대신 C FILE에서는 버퍼를 사용해 system call의 context switching overhead를 줄이려고 하고 있습니다.
즉, 호출할 때마다 바로 read/write를 하지 않고 내부 버퍼에 저장해두었다가 적절한 시점에 system call을 호출합니다.(printf와 비슷??)