Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Q
Quiz-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
정용석
Quiz-1
Commits
6537d9d8
Commit
6537d9d8
authored
Jan 17, 2025
by
정용석
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
quiz6 수정, answer.txt 추가
parent
60afe2f2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
138 additions
and
26 deletions
+138
-26
answer.txt
+114
-0
quiz6.cpp
+24
-26
No files found.
answer.txt
0 → 100644
View file @
6537d9d8
질문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
quiz6.cpp
View file @
6537d9d8
...
@@ -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
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment