포인터를 오프셋하기
아인
수학의 용도로 사용하려고 하는 배열(벡터)을 위해선 0 대신 1부터 색인하는 것이 필요할 때가 있다.
이때, 프로그램에서 다음과 같이 작성할 수 있다.
int n;
double *a;
....
a = calloc(n+1, sizeof(double));
a의 크기가 n보다 하나 더 크기 때문에, a[0]을 무시하고 a[1],...a[n]을 사용할 수 있다. 이 방법도 쓸만한 방법이다.
그러나, 다음과 같이 할 수도 있다. 먼저 다음과 같이 작성한다.
a = calloc(n, sizeof(double));그리고, 다음과 같이 한다.--a; /* offset the pointer */
여기서 a[0]은 프로그래머가 얻은 메모리가 아님을 나타낸다. 따라서, a[0]을 사용해서는 안 된다.
읽기와 쓰기 모두다 안 된다. 그러나, a[1],...,a[n] 원소는 프로그래머가 사용할 수 있다.
이 공간을 해제하기 위해서는 free(a+1)이라고 써야한다.
여기까지가 책 내용입니다.(A book on C)
그런데 제가 두껍게 표시한 부분이 이해가 잘 안됩니다.
a에다가 n의 크기만큼 동적할당을 하는건 알겠는데 거기서 --a를 한다고해서 a[0]을 쓸 수 없다라....
이해가 될 듯 하면서도 명확히 안가네요. 그리고 free(a+1)하는 것도요.
고수님들의 답변 부탁드립니다.
-
겨레
움.. calloc은.. 초기화까지 자동으로 시켜줘서.. 쓰는거 아닌가요..
realloc말씀하신건가요..? -
Sonya
noback2님 잘 이해했습니다.ㅋ
-
돌삥
음..
보통은 calloc은 거의 사용 안할듯합니다.
물론 필요하다면 사용 할지도 모릅니다만..
malloc을 사용하고 free 시켜주고 다시 malloc을 사용해주는것이 보다 효율적일지도 모릅니다.
기본은 0부터 시작해서 n-1까지 입니다.
여기서 n+1을 해주는 이유는 메모리의 크기를 +1만큼 (double) 이니까 8byte 이겠지요. -
찬내
포인터형 변수 뒤에.. 대괄호 쓰고.. 첨자 쓰면.. 그것은.. 그 포인터형 변수가 가리키는 지점을 기준으로 하여.. 얼마만큼 떨어져 있는 위치인가를 나타냅니다...
a[0] 은.. a에서.. 0만큼 떨어져 있는곳.. 즉 첫 요소를 말하구.. a[-1] 은.. a에서 -1만큼 떨어져 있는곳.. a[0]의 이전 요소를 말합니다..
위에서 제기한 불편한 점이.. 0부터 N-1 까지 참조해야 한다는게 불만사항(?)이죠..
1부터 N까지 참조하면 편할텐데..
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692401 | 유닉스안에서 C언어를 이용한 명함 만들기 입니다; 이해안가는 부분이있네요 | 2gether | 2025-04-22 |
2692374 | 고수님들 댓글 마니부탁해요!!! (2) | 엄지 | 2025-04-22 |
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |
2691697 | if 문에서 구조체 배열에 저장되있던 문자열 검사하는 법 ? (2) | 민트맛사탕 | 2025-04-16 |
2691678 | C언어 함수 질문이요~!!! | 연보라 | 2025-04-15 |