본문 바로가기
TIL

[TIL] 20220902 성장일지

by 마두식 2022. 9. 2.
반응형
C언어
  • scanf 문자열 입력시 발생하는 버퍼 문제

-  참고 링크 : https://modoocode.com/32

 

  • " " 와 ' ' 의 사용 용도 구분법

-  " " 는 문자열(한 개 이상의 문자)을 지정할 때 ex) "abc", "a"

-  ' ' 는 한 개의 문자를 지정할 때 ex) 'a', 'b'

 

  • 데이터 세그먼트 구조
  • 배열 선언 시 반드시 상수만 사용해야 하는 이유

-  스택과 데이터 영역에 할당될 메모리 크기는 컴파일 타임에 결정됨.
-  변수 초기화는 런 타임에 이루어짐.

-  #define과 같은 전처리기는 컴파일 이전에 처리가 완료되기 때문에 배열 선언 시 사용할 수 있다.

참고 링크 : https://modoocode.com/83

 

  • 모듈화 프로그래밍, 전처리기에 대한 이해
  • 컴파일과 링킹

-  컴파일 : 단일 소스 코드 전체를 어셈블리어로 변환(목적코드 .o 파일 생성 됨)
-  링킹 : 각기 다른 파일에 위치한 소스 코드들을 한데 묶어서 하나의 실행 파일로 만드는 과정

-  #include, #define, #ifdef, #endif 등

-  참고 링크1 : https://modoocode.com/87

-  참고 링크2 : https://modoocode.com/88

 

기타
  • 유체역학 엔진 개발기 강연 시청

-  관심이 있어 시청했지만 역시나 벅찬 내용이었음.

-  DirectX까지 좀 더 공부를 진행하고 다시 시청해 볼 계획.

-  강연 링크 : https://www.youtube.com/watch?v=AKCjgowhls8

 

 


 

기억할 내용
    • 포인터 배열, 포인터 배열을 가리키는 포인터, 문자열
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(int argc, char** argv) {
    printf("받은 인자의 개수 : %d \n", argc);
 
    for (int i = 0; i < argc; i++) {
        printf("이 프로그램이 받은 인자 : %s \n", argv[i]);
    }
 
    return 0;
}
cs

위의 코드에서 6번째 줄이 제대로 이해되지 않음.

argv[i] 에는 주소값이 저장되어 있는데 %s로 문자열을 읽는 부분이 이해가 되지 않았음.

포인터 배열, 포인터 배열을 가리키는 포인터 사이의 관계를 제대로 이해하지 못한 건가 싶어서 직접 테스트 코드를 작성함.

 

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(int argc, char** argv) {
    int a = 1, b = 2, c = 3;
    int* x = &a, * y = &b, * z = &c;
    int* p[3= { x, y, z };
    int** ptr = p;
    printf("%p\n"&a); // a의 주소
    printf("%p\n", p); // p의 주소
    printf("%p\n", ptr[0]); // p[0]에 들어있는 포인터의 값. 즉, a의 주소
    printf("%d\n"*ptr[0]); // p[0]에 들어있는 포인터가 가리키는 주소의 값. 즉, a의 값
    return 0;
}
cs

 

우선 포인터의 명확한 이해를 위해 다음과 같은 간단한 테스트 코드를 작성하여 확인함.

 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(int argc, char** argv) {
    const char* x = "hello"* y = "hi"* z = "abc";
    const char* p[3= { x, y, z };
    const char** ptr = p;
    printf("%p\n""hello"); // hello가 저장된 주소
    printf("%p\n", p); // p의 주소
    printf("%p\n", ptr[0]); // p[0]에 들어있는 포인터의 값. 즉, x("hello")의 주소
    printf("%s\n", ptr[0]); // hello가 출력됨.
    return 0;
}
cs

 

다음으로 정수형 대신 문자열을 이용하여 테스트 코드를 작성하여 확인함.

 

=>  포인터에 대한 부분은 제대로 이해한 게 맞았음

=>  printf("%s", ptr[0]) 와 같은 경우 ptr[0]는 배열의 시작 주소를 가리키고 있는게 맞음

=>  단 %s를 지정할 경우 배열의 시작 주소부터 NULL 문자가 나올 때까지 문자열을 출력하게 되는 것이었음.

 


 

포스팅을 하면서 돌아보면 당연한 내용이었는데 기본적인 부분을 깜빡하는 바람에 예상 이상으로 시간을 잡아먹었다.

이틀동안 C언어 복습을 끝내려고 했는데 뒤로 갈수록 내가 C언어를 제대로 공부하지 않았던 게 실감이 난다.

반응형

'TIL' 카테고리의 다른 글

[TIL] 20220908 성장일지  (0) 2022.09.08
[TIL] 20220907 성장일지  (0) 2022.09.07
[TIL] 20220906 성장일지  (0) 2022.09.07
[TIL] 20220905 성장일지  (0) 2022.09.06
[TIL] 20220901 성장일지  (0) 2022.09.02

댓글