*** printf() options
%hd - half decimal, 즉 short
%f - float와 double
%lf - long double
%5d - 우측 정렬, 빈칸 삽입
%+5d - 부호 표기
%-5d - 좌측 표기
%05d - 우측 표기, 좌측에 숫자'0' 삽입
%.2f - 소수점 이하 출력할 숫자의 개수 제한
0x%x 대신에 %p를 쓰면 자동으로 0x를 붙여준다.
주소 출력시 %p를 이용해 보자.
******************************************
*** 정수형과 실수형의 기본 자료형은 각각 int와 double이다.
따라서 int x = 10 에서는 형변형이 없지만
float y = 10.1 에서는 10.1을 double형으로 인식하여 이를 float로 자동 형변환 한다.
또한 다음의 경우 Error가 아니다.
static a[3];
이는 type을 안 써서 기본형인 int으로 인식하기 때문이다.
*** 기본 함수형태는 int FuncName (void) 이다.
따라서 int f1 (void) 의 경우 호출 전에 선언하지 않아도 인지한다.
******************************************
*** int main ( int argc, char * argc[], char * envp[] )
배열 envp 안에 환경 정보가 저장되어 있다.
이 배열의 마지막은 NULL이다.
******************************************
*** char * strdup (const char *)
입력 string의 메모리를 복사하는데, 또 다른 동적 메모리를 할당하여 복사한다.
추후 메모리 반환을 해줘야 한다.
******************************************
*** 지역변수를 stack에 저장할 때 I/O 크기에 따라 자동으로 메모리 공간을 일부러 띄운다.
char 형, short 형 변수를 각각 선언하면 stack의 높은 주소의 위치부터 차례로 이용하는데,
char 가 1byte이고 short가 2byte일 때 다음과 같은 경우가 될 수 있다.
예1)
8F - char
8E - 없음
8D - short 상위
8C - short 하위
예2) - visual C++ 6.0 실험 결과
8F - 없음
8E - 없음
8D - 없음
8C - char
8B - 없음
8A - 없음
89 - short 상위
88 - short 하위
******************************************
*** prompt 상에서 editor 실행
gedit &
-> gedit text editor 실행
kate &
-> gedit와 다른 text editor
******************************************
*** PC에서 vmware 상의 linux와 기본 OS인 winXP 사이의 ftp 파일 전송 방법
*** 주의 !!! 일부 설정 방법이 생략되어 있음
service vsftpd start
-> linux 內 ftp 서버 활성화
winXP에서 vmware 상이 linux의 IP에 대해서 ftp 연결 시도
ftp [Linux IP]
get, put 혹은 mget, mput 이용 파일 전송
******************************************
*** 틀리기 쉬운 C 문법
#define FLAG 0x02 일때
flag 변수의 bit 2가 set인지 확인하고자 한다면,
if (flag & FLAG) 를 써야 하는데,
if (flag & FLAG != 0) 로 쓰면 != 가 & 보다 우선하므로 틀린다.
val = high << 4 + low;
에서 high를 상위로 하고 low를 하위로 하는 것처럼 오인할 수 있는데,
산술연산자 + 가 먼저 실행되어 잘못된 계산을 하게 된다.
== 은 < , > 보다 우선 순위가 낮아서
n1 > n2 == n2 > n3
의 경우 == 가 나중에 되므로 주의한다.
치환연산자는 관계연산자보다 우선순위가 낮다. (사실 치환연산자는 제일 낮다.)
while ( c = getchar() != '\n' )
에서 != 를 먼저하므로 error이다.
******************************************
*** code 상에 정의되지 않은 값을 compile할 때 정의하는 방법
opPriorErr.C 파일을 cc를 이용하여 compile할 때,
'CASE' 라는 값을 '1'로 설정하려면
다음과 같이 '-D' 이후에 'CASE'를 입력한다.
cc -DCASE=1 opPriorErr.C
'c'에 해당되는 글 7건 |
||
임베디드 기초 교육 정리 :: 2007/08/26 11:33 |
||
CONTAINING _RECORD macro :: 2007/04/26 00:10구조체안의 특정 field의 주소를 통해서 그 field를 포함하고 있는 실제 구조체(객체)의 주소를 얻을 수 있는 방법이 있다. 그때 쓰는 매크로가 CONTAINING_RECORD 매크로이다.
우선 CONTAINING_RECORD 매크로처럼 유용한 매크로를 먼저 소개하면, offsetof 라는 매크로가 있다. 이를 이용하면 특정 구조체에서 해당 field의 offset을 알 수 있다. offsetof 매크로에서 (unsigned long)(&((type *)0)->field) 뜻은, 0을 주어진 type의 시작점이라고 가정하도록 타입캐스팅을 한 후에, 그 type의 field를 엑세스 하여, type의 시작점부터 field 까지의 거리를 구하는 것이다. 즉, 0부터 field까지 offset이 얼마냐를 구하는 것이다. (바로 위 문단, 3줄은 데브피아 링크의 김희준 님의 글을 조금 수정하여 인용한 것입니다.) 위의 offsetof 매크로의 기능을 그대로 이용한 것이 CONTAINING_RECORD 매크로이다. 이 매크로에서는 구조체 안의 특정 field에 대해서 구조체 시작부터의 offset 값을 구하고, 이를 실제 그 구조체 객체에서 그 field 주소에서 offset 값만큼 작은 주소로 이동한 값을 계산하여 구조체 객체 자체의 주소를 얻는다. 특히 이는 구조체 안에 리스트 구조가 포함되어 있을 때 유용하다. 리스트를 포함하는 구조체의 이름만 안다면 특정 리스트의 시작 주소를 넣어서 그 리스트를 포함하는 실제 구조체 객체의 주소를 얻을 수 있는 것이다. 아래 코드는 직접 실행해서 이를 확인한 것이다. 코드 실행 결과처럼 offsetof와 CONTAINING_RECORD 매크로 둘 다 잘 동작한다. 위에서 설명했듯이 (type *)0에서 0을 시작점으로 하기에, 코드에서 (testStr*)3 라고 해서 3을 시작점으로 할 수도 있음을 확인할 수 있다. 참고적으로 CONTAING_RECORD의 offset 부분에 offsetof 매크로를 넣어서 매크로를 구성할 수도 있다. 끝으로 CONTAING_RECORD 매크로에서 offset 부분 앞에 (unsigned long)을 붙였는데, (unsigned long *)라고 되어 있는 자료도 봤다. Visual Studio 6.0에서 테스트 해보니 둘 다 제대로 된 값은 나오는데, (unsigned long *)라고 했을 경우 incompatible types 의 compile warning이 뜬다. #include ![]() Trackback Address :: http://www.neodelicious.com/trackback/40
|
||
크기 미지정 배열의 새로운 고찰 :: 2007/04/19 22:00C에서 배열은 포인터와 혼용되면서 많은 혼란을 가져오는 특징 중의 하나이다.
그러한 배열을 선언할 때는 그 크기를 지정해 주어야 하며 다만 배열을 선언하면서 동시에 그 값을 채워줄 때는 크기를 지정하지 않아도 되는 것으로 알고 있었다. 그래서 char a[] = "ab"; 는 가능해도 char a[]; 는 에러가 된다. 그런데 구조체 속에 선언한 크기 미지정의 배열은 어떻게 될까? 에러일까? 정답부터 말하면 가능하다. 좀더 말해서 해당 구조체 메모리 할당시 구조체 안에 크기 미지정의 배열에 대한 메모리는 할당되지 않는 것 같다. 이는 구조체에서 이 크기 미지정의 배열 대신 포인터를 넣으면 포인터 크기, 주로 4byte가 잡히는 것과 비교할 때 특이한 점이라 할 수 있다. 이러한 특징을 이용해서 구조체의 가장 끝 필드(Field)값으로 이러한 크기 미지정 배열을 넣고, 이 구조체에 대한 메모리를 할당할 때 구조체 자체의 메모리 크기에 더해서 해당 배열의 타입(type)의 배수 크기로 추가적인 메모리를 잡으면 그 배열 이름과 인덱스(index)로 추가된 메모리를 접근할 수 있다. 이 경우 구조체 메모리를 할당할 때마다 해당 배열의 크기를 원하는 만큼으로 조절할 수 있는 장점이 있다. 아래 코드는 이를 확인하기 위해 작성한 것으로서 특이한 사항은 추가적인 메모리를 할당하던 안 하던 크기 미지정 배열의 주소가 int 변수의 주소값에서 4만큼 큰 주소값이라는 것이다. 메모리는 할당되지 않지만 주소값은 있는 것처럼 보이는 것이다. #include <stdio.h>
printf("T1 size : [%d], T2 size : [%d]\n", sizeof(T1), sizeof(T2)); printf("p1 : [%x], &p1->a : [%x], &p1->ch : [%x]\n\n", p1, &p1->a, &p1->ch); printf("p2->ch[0] : [%c]\n", p2->ch[0]); printf("\np3 : [%x], &p3->a : [%x]\n", p3, &p3->a); ![]() Trackback Address :: http://www.neodelicious.com/trackback/39
|
||
Verify() :: 2007/04/14 18:32해당 코드의 값이 참이라고 생각하는데 실제로 그런지 확인하고 갈 때 Trackback Address :: http://www.neodelicious.com/trackback/37
|
||
다시 체계적으로 배우는 C언어 포인터 개인 정리[비공개][보호되어 있는 글입니다. 비밀번호를 입력해 주세요.]
Secret Entry! Enter Password |
||
다시 체계적으로 배우는 C 언어 포인터 :: 2007/03/11 18:04![]() 다시 체계적으로 배우는 C 언어 포인터 예전에 도서관에서 빌려다 읽었던 책인데, 오늘 서점에 갔다가 눈에 띄어서 추천(?) 삼아 글을 올려본다. 내 기억으로는 일부는 굳이 그럴 필요가 없는데 권장하는 부분도 있었다. 그런데 대부분 포인터에 대해서 설명을 잘 해 놨던 것으로 기억한다. <책 겉표지 그림 출처 : yes24> yes24 링크 Trackback Address :: http://www.neodelicious.com/trackback/22
|
||
fgets() 사용 시 유의점 :: 2007/02/25 18:22fgets() 사용 시 유의점
fgets()에 대한 기본 설명은 아래 링크를 참조하자. Trackback Address :: http://www.neodelicious.com/trackback/8
|
||



