보안프로그래밍 몇가지 문제풀이 관련2
보안프로그래밍을 공부하고 있는데요.
다른분들이 생각하는 문제의 답변을 듣고
공부하는데 도움을 받고 싶어서 올리게 되었습니다.
1. 다음 프로그램은 어떤 값을 출력하겠는가? 먼저 생각해 보고 실행해 보아라.
그리고, 왜 이런 결과가 출력되는지 설명하여라.
#include <stdio.h> void f(int a[3]); int main(void) { char s[]="I like C."; char *p="I like C."; int a[3]; double d[5]; printf("%s%d\n%s%d\n%s%d\n%s%d\n", "sizeof(s)=", sizeof(s), "sizeof(p)=", sizeof(p), "sizeof(a)=", sizeof(a), "sizeof(d)=", sizeof(d), f(a); return 0; }
2. 다음과 같은 배열 멤버를 갖는 구조체 형이 있다고 하자.
struct subject { int num; int grade[]; };
이때 다음과 같은 코드를 실행하면 올바르게 출력되는지 프로그램을 작성하여 실행하여 확인해 보아라.
struct subject s; s.grad[0]=10; printf("%d\n", s.grade[0]);
그리고, 프로그램의 실행 결과가 10으로 올바르게 출력된다고 하더라도 잘못된 코드이기 때문에 잘못된 부분을 찾아 수정하라.
(hint: 구조체 배열 멤버의 크기에 주의)
3. 다음 프로그램은 어떤 값을 출력하겠는가? 출력 결과에 대해 설명하여라.
#include <stdio.h> enum day {SUN, MON, TUE, WED, THU, FRI, SAT}; enum name {kim, lee, park, jung, hong=266}; int main(void) { printf("sizeof(enum day)=%d\n", sizeof(enum day)); printf("sizeof(enum name)=%d\n", sizeof(enum name)); return 0; }
4. 시스템에 따라 여러 바이트로 이루어진 객체를 메모리에 저장하는 방법이 다를 수 있다.
다중 바이트 객체를 저장하는 방법에 대해 조사하여 작성하시오.
(a) 리틀 엔디언(little endian)과 빅 엔디언(big endian)에 대해 조사하여 설명하여라.
(b) 사용하는 시스템이 어떤 엔디언을 사용하는지 알아낼 수 있는 endian공용체를 정의하고 설명하여라.
(c) endian 공용체를 사용하여 사용하는 시스템이 어떤 엔디언인지 알아내는 프로그램을 작성하여라.
(d) 리틀 엔디언을 빅 엔디언으로 또는 그 반대로 저장하는 함수를 정의하고 해당 프로그램을 예를 들어 작성하여라.
5. 다음 프로그램을 실행하여 보고 왜 가장 큰 정수 값을 출력하는지 설명하여라.
#include <stdio.h> int main(void) { unsigned long long val=-1; printf("가장 큰 정수: %llu\n", val); return 0; }
6. char 형 변수는 작은 정수를 다룰 때 사용될 수 있다. 만일 char형이 다룰 수 있는 값보다 큰 값이 char 형 변수에 배정되면 어떻게 되겠는가?
다음 프로그램은 컴파일할 때 경고 메시지가 출력되겠지만 실행될 것이다. 그 결과를 보고 설명해 보아라.
#include <stdio.h> int main(void) { char c1=256, c2=257; printf("c1=%d\n c2=%d\n", c1, c2); return 0; }
7. 다음 프로그램을 실행하고 출력 결과에 대해 설명하여라.
#include <limits.h> #include <stdio.h> int main(void) { int i; unsigned u=UINT_MAX; for(i=0; i<10; ++i) printf("%u+%d=%u\n", u, i, u+i); for(i=0; i<10; ++i) printf("%u+%d=%u\n", u, i, u*i); return 0; }
8. 다음 프로그램을 실행해 보고 출력 결과에 대해 설명하여라.
#include <stdio.h> int main(void) { unsigned char a=200, b=100, d; signed char c=-50; d=a+b+c; printf("%d\n", d); return 0; }
댓글 달기