1. 다음 코드는 어떻게 출력될까요??


int main(){
    fprintf(stderr, "Hello ");
    fprintf(stdout, "It's a small ");
    fprintf(stderr, "World\n");
    fprintf(stdout, "place\n");
    return 0;
}



2. 다음 두 선언은 어떻게 다를까요? 각각의 sizeof는 얼마를 반환할까요?


char str1[] = "bhuvan";
char *str2 = "another one";


3. C에서 string이란 무엇일까요?



4.간단한 my_strcmp, my_strcat, my_strcpy, my_strdup를 짜보세요.

(Bonus : 각각의 함수에서 문자열을 한 번만 읽도록 만들어보세요.)



5.다음은 무엇을 return할까요?


int *ptr;
sizeof(ptr);
sizeof(*ptr);



6. malloc이란 무엇일까요? calloc과의 차이점은 무엇인가요? 일단 메모리가 malloc되면 realloc은 어떻게 사용할까요?


7. & operator와 *operator는 무엇인가요?


8. 아래와 같은 변수들이 주어진 주소에 존재한다고 가정하면, 다음 포인터 연산이 가리키는 주소는 어디일까요?


char** ptr = malloc(10); //0x100
ptr[0] = malloc(20); //0x200
ptr[1] = malloc(20); //0x300
 * `ptr + 2`
 * `ptr + 4`
 * `ptr[0] + 4`
 * `ptr[1] + 2000`
 * `*((int)(ptr + 1)) + 3`


9. double free error은 어떻게 방지할 수 있을까요?


10. int형, char형을 출력하는 출력서식자는 무엇일까요?


11. 다음 코드는 valid합니까? 그렇다면, output은 어디에 있습니까?


char *foo(int var){
    static char output[20];
    snprintf(output, 20, "%d", var);
    return output;
}


12. 문자열을 읽어 파일을 열고 40자는 원래 순서로, 다음 40자는 뒤집어서 출력하는 함수를 만들어 보십시오. (POSIX API를 사용해보십시오)



13. PISIX file descriptor와 C의 FILE*의 차이점은 무엇입니까?(어떤 함수 호출을 사용하는지, 어느 것이 buffer되는지) POSIX는 내부적으로 C의 FILE을 사용합니까 아니면 반대입니까??







5.

int형 포인터 - 8바이트

ptr은 int형 포인터이므로 8바이트

*ptr은 int형 포인터가 가리키는 값이므로 int, 즉 4바이트



6.

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.





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와 비슷??)


_M#]



'Angrave System Programming > Learning C' 카테고리의 다른 글

Debugging(4)  (0) 2019.01.09
Debugging(3)  (0) 2019.01.09
Debugging(2)  (0) 2019.01.09
Debugging(1)  (0) 2019.01.09
Strings and Structs(2)  (0) 2019.01.09
Posted by 몰랑&봉봉
,