c언어 여쭈어봅니다ㅠㅠㅠㅠ 뭐가 문제인지 모르겠습니다
#define CRTSECURENOWARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void inputWords(char* words[] , char contents[]) {
char* word;
word = contents;
words = (char)calloc(strlen(contents) + 1, sizeof(char));
// 할당해준 메모리는 총 12바이트
strcpy(words, word);
}
int main(void)
{
char* arrptr[3];
inputWords(arrptr, "hello world");
printf("%s\n", arrptr);
// arrptr[0]에서 가리키는게 "hello world"
printf("%d\n", sizeof("hello world"));
// 당연히 12가 나옴
printf("%d\n", sizeof(*arrptr))
// "hello world"의 크기니까... 12가 나오겠지...? 엥 4가 나오네
return 0;
}
질문1.
저는 저 "hello world" 에 접근할때 (arrptr[0]) 이나 *(*arrptr)) 하면 접근이 가능할 줄 알았는데
그것도 아닌건가요? 저 그림은 제가 해당 코드 내용을 그림으로 그려본겁니다.
질문2.
분명히 printf("%s", arrptr) 하면 "hello world" 가 잘 나옵니다.
그런데 printf("%d", sizeof(*arrptr)) 을 하면 당연히 sizeof("hello world") 라서 12가 나올 줄 알았는데
4가 나옵니다. 이유가 궁금합니다.
소스코드 파일 다운로드 : https://github.com/sigmak/exercise4_01/tree/2021-09-24-C-inputWordsTest
우선 sizeof 함수는 매개변수가 포인터인 경우 해당데이터형의 기본 사이즈만 가져오는거 같아요.
그래서 sizof 함수의 매개변수에 문자열을 직접 넣었을때와 문자열이 담긴(?) 포인터 변수를 넣으면 크기가 달라집니다.
그리고 strlen 함수는 문자열의 끝에 붙는 \0 = NULL 을 제외한 크기를 반환하고
sizof 함수는 문자열의 끝에 붙는 \0=NULL 을 포함한 크기를 반환하니까
차이가 생기는 걸로 보여집니다..
참고 : https://int-i.github.io/c/2020-04-03/c-string/
그리고 질문에 사용된 소스코드는
Visual Studio 2015 버전의 C++ 에서 컴파일시 메모리 오류가 발생해서 약간(?) 수정했습니다.
1. 소스코드
2. 컴파일후 실행결과 캡쳐
왜냐하면 "hello world"의 sizeof를 찍은 것이 아니라 arrptr을 printf로 찍었기 때문입니다.
현재 실행한 프로그램에서 포인터는 크기가 4 byte로 고정이기 때문에 4가 나오는 것입니다.
그러나 sizeof("hello world")의 경우는 hello world가 스태틱 메모리에 저장되고,
그 문자열의 크기를 찍은것이므로 12가 나오게 됩니다.