오늘은 간단하게 문자열 리터럴만 올리도록 하겠습니다. "chogahui", "xi" 이런 것들을 우리는 리터럴이라고 합니다. 그러면, 이것들은 어디에 어떻게 저장이 되길래, 이들을 바꾸려고 하면 RTE가 뜰까요? 예제 프로그램 1을 봅시다. 4번째 줄에 보면 "chogahui" 라는 리터럴이 있습니다. 이것을 p가 가리키고 있어요. 그리고 p[0]에 'x'를 넣습니다. 6번째 줄에 p를 출력하는데요. "xhogahui"라는 내용이 출력될 거 같아요. 그런데, Seg fault가 뜹니다. 어떻게 된 걸까요? 이 상황을 다시 그려봅시다. p가 "chogahui"를 가리키고 있어요. 그러면 p[0]은 "chogahui"의 1번째 요소인 'c'일 겁니다. 이것을 'x'로 바꾸는 연산은, 메모리의 어느 영역에 '..
C언어 검색 결과
포인터에 const가 붙으면 상당히 헷갈립니다. 이것들은 대체 무엇을 의미하는 것일까요? 먼저 아래와 같이 선언된 것을 봅시다. 이것은 p가 const char형을 가리키는 포인터임을 의미합니다. strcpy나, strcat 등의 인자가 이런 식으로 선언이 많이 되어 있음을 볼 수 있을 거에요. 예를 들면 이런 식입니다. 이는 original data인, 원본 문자열이 변경되면 안 되기 때문이에요. 12번째 줄은, *(ori+1)을 변경하려고 시도하는데요. ori가 const char형을 가리키는 포인터입니다. 이는 변경 불가능한 Read Only data입니다. *(ori+1) 또한, Read Only이고, 이를 변경하려고 하기 때문에, 오류가 발생합니다. const char *pat은, pat이 가리..
포인터의 증감 연산을 간단하게 다루어 보도록 하겠습니다. 포인터 변수의 값 + 값 먼저, 이 경우부터 보도록 합시다. 아래 프로그램을 생각해 봅시다. int형 변수 a가 선언되었습니다. 그리고 p는 int형 포인터 변수입니다. p는 a의 주솟값을 가지고 있어요. 그러면, p, p+1, p+2는 각각 어떤 값이 나올까요? 4만큼 차이나는 것을 볼 수 있어요. p+1은, p로부터 4바이트, p+2는 p+1로부터 4바이트만큼 증가한 것을 볼 수 있는데요. 자료형의 크기만큼 더했다는 것을 볼 수 있어요. long long형이면 어떨까요? sizeof(long long)의 값도 같이 출력해 봅시다. 처음에 size = 8이 나왔습니다. 해당 환경에서, long long형은 8byte만큼 차지한다는 의미입니다. 이..
저번 시간에 포인터 변수에 대해 배웠습니다. 오늘은 구조체 포인터를 써 보도록 하겠습니다. 사실, 링크드 리스트 구현할 때 상당히 많이 쓸 거에요. 예를 들어서 p->next? 아니면 p->prev? 이런 식으로 많이 쓰실 건데요. ->가 무엇인지도 오늘 알아보도록 하겠습니다. 먼저 main 함수 안에 point형 구조체 변수가 선언이 되어 있다고 해 봅시다. 8번째 줄에 point형 지역 변수인 p를 선언했습니다. 그러면 메모리에는 위와 같이 할당이 될 겁니다. 맞나 모르겠네요. 그러면, 메모리의 어느 위치에, p를 위한 공간이 만들어 진 거에요. 역참조도 할 수 있을까요? 주솟값만 알고 있다면, 그것을 통해서 간접 참조를 할 수 있을 텐데요. 9번째 줄을 보면, t에 p의 주솟값을 넣고 있습니다. 그..
c++의 algorithm 헤더에는, 두 변수를 바꾸는 swap 메서드가 있습니다. 두 수를 바꾸는 swap 함수를, 구현해 봅시다. 저번 시간에 배운 포인터도 복습해 볼 겸 말입니다. Main 함수에 a와 b가 할당되어 있습니다. 우리는 함수를 통해서 이 둘을 바꿔보려고 합니다. 그런데, 함수로 이 둘을 깡으로 넘기기에는, 힘들어 보입니다. 왜냐하면, 정수형으로 그냥 복사해 버리면, 다음과 같이 별개의 공간에 매개 변수가 생성이 되기 때문입니다. 그러면 우리는, Main에 있는 a의 주솟값과, b의 주솟값을 넘기자는 생각을 할 수 있습니다. 이 둘의 주솟값을 각각 0x80번지, 0x84번지라고 한다면, 다음과 같이 복사하면 됩니다. 이러한 주솟값을 저장할 수 있는 변수는 포인터 변수입니다. 정수형 포인..
최근댓글