컴퓨터공부 362

Off-by-one error

어이가 없겠지만, 내가 저지른 off-by-one error(논리적인 에러..쯤으로 이해하자) 이다. sizeof(), memcpy(), memset() 함수는 언제나 꼼꼼히 신경써서 써야 할 것 이다. + void foo (char *s) { char buf[15]; memset(buf, 0, sizeof(buf)); strncat(buf, s, sizeof(buf)); // Final parameter should be: sizeof(buf)-1 return; } Off-by-one error From Wikipedia, the free encyclopedia Jump to: navigation, search An off-by-one error (OBOE) is a logical error invol..

Cfaq 16

Q 12.1 이 코드에서 잘못된 부분이 있나요? char c; while ((c = getchar()) != EOF) ... Answer 일단, getchar의 리턴 값을 저장하는 변수는 반드시 int이어야 합니다. getchar()는 어떠한 문자 값이나, EOF를 리턴할 수 있습니다. EOF는 int 타입이기 때문에 이 리턴 값을 char에 저장하는 것은 EOF를 잘못 해 석하게 할 소지가 있습니다 (특히 char의 타입이 unsigned인 경우 문제가 심각합니다). 위의 코드처럼 getchar()의 리턴값을 char에 담을 경우, 두 가지 결과를 예상할 수 있습니다. ² char의 타입이 signed인 경우, 그리고 EOF가 -1로 정의된 경우, 문자 값이 부호 확장(sign extension)되어,..

Cfaq 15

longlong 혹은 __int64를 사용하면 큰 숫자에 대한 연산을 할 수 있다. + Q 11.I 원하는 크기에 정확히 맞는 정수 타입을 쓰고 싶습니다. 새로운 C 표준에서 이러한 타입을 제공한다고 들었는데, 맞습니까? C99 표준에 따라, 또는 를 포함시킬 경우, 다 음과 같은 타입을 쓸 수 있습니다. 아래 표에서 N 은 8, 24와 같은 십진 수를 뜻합니다. 또한 두세번째 열에서 나온 최대/최소값을 위한 매크로는 를 포함하기 전, __STDC_LIMIT_MACROS를 정의해야 쓸 수 있 습니다. #define __STDC_LIMIT_MACROS #include 표준에 따라 정확히 말하면, int_16_t, int32_t등이 정의된 헤더 파일은 에 정의되어 있고, 는 를 포함하게 되며, 부가적인 사항..

Cfaq 14

Q 11.A 자주 쓰이지는 않다고 알고 있는데, volatile이 정확히 어떤 의미를 가지 는 것인가요? Answer volatile 타입 qualifier는 주어진 오브젝트가 컴파일러가 의도하지 않은 방식으로 변경될 수 있다는 것을 나타냅니다. 따라서, 컴파일러는 이 오브젝 트를 최적화(optimization) 과정에서 제외시킵니다. 좀더 정확히 말해서, 이 오브젝트에 대한 참조(reference)나 변경(modification)은 sequence point 를 넘어다니며 최적화되지 않습니다. 단, sequence point 안에서 최적화될 수 있습니다. (sequence point에 관한 것은 질문 3.8을 참고하기 바랍니다.) 일반적으로, volatile이 쓰이는 곳은 크게 두 가지로 나누어 생각할..

&array[0]와 array 의 차이점은 무엇인가요?

배열형 자료구조를 구현할 경우 사용해야합니다. 예를들어 배열의 경우 배열명 자체로 배열의 첫 포인터를 얻을 수 있지만 클래스로 구현된 배열의 경우 오퍼레이터 []를 구현하기 때문에 배열처럼 사용해도 배열과 다른 메모리 위치를 갖습니다. 결국 습관적으로 안전한 코드가 되려면 &array[0] 이러한 형태가 더 좋습니다. 설명이 애매하다면 아래 글을 참고해보세요. http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=480 아치븐 님이 쓰신 글 : : 제목 그대로 입니다. : : 인자를 주소값으로 넘겨줄 때, : : &array[0]와 array 의 차이점은 무엇인가요? : : 제가 알기로는 &와 [] 가 같이 들어가면 상쇄되..

Cfaq 13

Q 11.17 ANSI “stringizing” 전처리기 연산자인 #를 써서 심볼릭 상수의 값을 문자 열에 집어 넣으려고 합니다, 그런데, 그 결과, 상수의 값이 들어가는 대신, 상수의 이름이 들어가는군요. Answer #의 정의에 따르면, 이 것은 매크로 인자를 (인자가 또 다른 매크로 이름 이더라도 더 이상 확장하지 않고) 바로 문자열로 만듭니다. 매크로가 원래 지닌 뜻으로 확장되길 원한다면 다음과 갈이 두 단계를 거쳐서 쓸 수 있습 니다: #define Str(x) #x #define Xstr(x) Str(x) #define OP plus char *opname = Xstr(OP); 이 코드는 opname을 “OP”로 설정하지 않고, “plus”로 설정합니다. (즉, Xstr() 매크로가 인자를 확..

Cfaq 12

그렇다.. "void main()"은 틀린 표현이다. "int main"이 표준이다. + Q 11.12a main()의 정확한 선언 방법을 알고 싶습니다. Answer main()의 선언은 다음 중에서 골라 써야 합니다: int main(void); int main(int argc, char *argv[]); argv를, char **argv로 선언할 수도 있습니다. (질문 6.4를 참고하기 바 랍니다.) (물론 이때 ‘argv’와 ‘argc’라는 이름은 얼마든지 바꿀 수 있습니 다.) 또 오래된 스타일을 써서 다음과 같이 할 수도 있습니다: int main() int main(argc, argv) int argc; char **argv; 질문 11.12b부터 11.15까지 참고하기 바랍니다. Q 11...

Cfaq 11

Q 11.11 다음과 같은 선언에서: typedef char *charp; const charp p; 왜 p가 가리키는 char가 const가 되지 않고, p 자체가 const가 되는 것 일까요? Answer Typedef로 치환한 것은 순수하게 textual 치환이 아닙니다. (이 것은 typedef를 쓰는 한가지 장점이기도 합니다; 질문 1.13 참고) 다음과 같은 선언 에서: const charp p; const int i가 i를 const로 만드는 것과 같은 원리에서, p는 const가 됩니다. p에 대한 선언은, 포인터가 관련이 되어있는지 typedef 안까지 쫓 아가서 확인하지 않습니다. Note 아래와 같은 선언이 있다고 가정하고 (질문 11.9 참고): int * const const_po..

공부 하고 싶은 책 정리

소장한 책 =============================================================== 임베디드 하드웨어 이해와 설계(빌림) An Embedded Software Primer : 입문자를 위한 임베디드 시스템 Efficient C++ Code Complete 리눅스 커널 심층 분석 (임베디드 개발자를 위한) Understanding SNMP MIBs Writing solid code Code Complete 리눅스 커널 심층 분석 (임베디드 개발자를 위한) + 미소장 책 =============================================================== 'Professional Software Development' : Professio..

컴퓨터공부 2009.04.14

Cfaq 10

Q 10.27 __FILE__과 __LINE__ 매크로를, 디버그용으로, 메시지 출력하는 매크로에 쓰고 싶습니다. 어떻게 하면 될까요? Answer 질문 10.26을 간단히 하기 위해, 따로 만든 질문입니다. 한가지 방법은, 가 변 인자를 받는 함수를 만들고 (질문 15.4, 15.5 참고), __FILE__과 __LINE__ 을 받아서 그 함수에 전달해 주는 함수를 따로 만듭니다. 예를 들면: #include #include void debug(char *fmt, ...); void dbginfo(int, char *); #define DEBUG dbginfo(__LINE__, __FILE__), debug static char *dbgfile; static int dbgline; void dbginf..