Commit 6537d9d8 by 정용석

quiz6 수정, answer.txt 추가

parent 60afe2f2
질문1. 아래 C언어 코드를 컴파일단계부터 실행하여 종료되기 까지의 과정을 컴퓨터에서 어떻게 동작하는지 할수있는 만큼 최대한 자세히 3분동안 설명해보세요.
#include <stdio.h>
#define PI 3.14
int foo(int *a, const int b)
{
int res = *a + b;
*a = *a / PI;
return res;
}
int main() {
int v = 10;
int result = 0;
result = foo(&v, 2);
printf("result = %d\n", result);
return 0;
}
전처리기가 #으로 시작하는 지시문을 처리한다. stdio.h 헤더 파일의 내용을 소스 코드에 포함한다.
코드 내 PI를 모두 3.14로 치환한다.
전처리된 코드를 어셈블리 언어로 변환한다.
어셈블리 코드를 기계어로 변환하여 오브젝트 파일(.o)을 생성한다. 이 파일은 독립적으로 실행 할 수 없으며,
링킹이 필요하다.
링커가 오브젝트 파일과 표준 라이브러리를 결합하여 실행 가능한 바이너리 파일(.out)을 생성한다.
다음으로 생성된 실행 파일을 실행하면, 운영체제가 프로그램 실행을 위해 필요한 작업을 수행한다.
운영체제가 실행 파일을 메모리에 로드한다.
코드 영역, 데이터 영역, 힙, 스택 등이 메모리에 할당된다.
메인 함수의 진입점을 설정하고 실행을 시작한다.
최초에 v 는 10, result 는 0으로 초기화된다.
foo 함수의 인자로 &v와 2를 받아 반환값을 result에 저장한다.
foo 함수를 호출하면
result에 12가 저장된다.
v에 12/3.14 를 하면 3이 저장된다.
printf함수를 호출하면 result에 저장된 값이 출력된다.
return 0 을 통해 프로그램이 종료된다.
운영체제가 프로그램의 메모리와 리소스를 해제한다.
질문2. 아래 현상을 설명해주세요.
철수는 아래와 같은 파일 출력 코드를 작성하여 sample.dat 파일을 생성하였다.
#include <stdio.h>
int main() {
int v = 0xc0ffee;
FILE *fp = fopen("sample.dat", "wb");
printf("v = 0x%x(%d)\n", v, v);
fwrite(&v, 1, sizeof(v), fp);
fclose(fp);
return 0;
}
철수는 영희에게 sample.dat와 아래의 코드를 전달하며 확인을 해보라고 하였다.
#include <stdio.h>
int main() {
int v = 0;
FILE *fp = fopen("sample.dat", "rb");
fread(&v, 1, sizeof(v), fp);
printf("v = 0x%x(%d)\n", v, v);
fclose(fp);
return 0;
}
철수는 영희가 0xc0ffee를 볼 수 있기를 기대했지만 영희는 0xeeffc000이 출력된다고 하였다.
바이트 순서와 관련된 문제이다. 바이트 순서에는 리틀 엔디안, 빅 엔디안이 있다.
리틀 엔디안은 낮은 바이트부터 저장하고, 빅 엔디안은 큰 바이트부터 저장한다.
따라서 이 문제는 시스템 간의 엔디안 차이 때문에 발생하는 문제이다.
질문3. 현재까지 보았던 개발 관련 서적/강좌 등을 나열해주세요.
학과수업 - c, cpp, java, python,
질문4. 알고 있는 자료구조를 최대한 많이 나열해주세요. 실제 동작을 이해하지 못했거나 이름만 들어본 것이라도 상관없습니다.
Array, Linked List, Queue, Stack, Graph, Set, Map, Tree, Heap, ..
질문5. 세그멘테이션 폴트가 발생하는 예와 왜 세그멘테이션 폴트가 발생하는지 최대한 자세히 설명해주세요.
프로그램이 메모리 접근 오류를 일으킬 때 발생하는 런타임 오류이다. 주로 잘못된 메모리 접근을 시도할 때 발생한다.
질문6. 아래와 같은 코드가 있습니다. 코드를 개선해주세요.
void my_strcpy(char *s1, char *s2) {
while(*s1++ = *s2++);
}
quiz6.cpp 참고
질문n. 자기자신을 출력하는 프로그램(quine)을 가장 자신있는 언어로 작성해보세요.
quine.cpp 참고
\ No newline at end of file
...@@ -2,41 +2,39 @@ ...@@ -2,41 +2,39 @@
#include <stdlib.h> #include <stdlib.h>
unsigned int my_strlen(char *s){ unsigned int my_strlen(char *s){
unsigned int i = 0; unsigned int i = 0;
while(s[i] != '\0'){ while(s[i] != '\0'){
i++; i++;
} }
return i; return i;
} }
void my_strcpy(char *s1, char *s2) { void my_strcpy(char *s1, char *s2) {
char copyS2[my_strlen(s2) + 1]; if(my_strlen(s1) <= my_strlen(s2)){
int i = 0; printf("Error : 첫 번째 인자의 배열의 크기가 두 번째 인자의 크기보다 작기 때문에 정상적인 복사가 되지않습니다.\n");
while(s2[i] != '\0'){ return;
copyS2[i] = s2[i]; }
i++; int i = 0;
} while(s2[i] != '\0'){
s1[i] = s2[i];
if(my_strlen(s1) <= my_strlen(s2)){ i++;
printf("Error : 첫 번째 인자의 배열의 크기가 두 번째 인자의 크기보다 작기 때문에 정상적인 복사가 되지않습니다.\n"); }
}else{ s1[i] = '\0';
while(*s1++ = *s2++);
}
} }
int main() { int main() {
char s1[] = "abcd"; char s1[] = "abcd";
char s2[] = "efghijk"; char s2[] = "efghijk";
my_strcpy(s1, s2); my_strcpy(s1, s2);
printf("%s\n%s\n", s1, s2); printf("%s\n%s\n", s1, s2);
char s3[] = "abcdefg"; char s3[] = "abcdefg";
char s4[] = "hijk"; char s4[] = "hijk";
my_strcpy(s3, s4); my_strcpy(s3, s4);
printf("%s\n%s\n", s3, s4); printf("%s\n%s\n", s3, s4);
return 0; return 0;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment