인프런 커뮤니티 질문&답변

Windfall님의 프로필 이미지
Windfall

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

포인터 vs 배열

질문입니다!

작성

·

224

0

const char* test1 = "Hello World";

Hello World가 메모리 어딘가에 생성되고

test1은 그저 Hello World가 어디있는지만 알려줌

포인터이기 때문에 4바이트 or 8바이트

char test2[] = "Hello World";

Hello World가 메모리 어딘가에 일단 생성됨

Hello World가 있는곳을 찾아서 4바이트씩 끊어서 계속

test2 배열에 넣어줌

그래서 문자열의 크기가 커지면 크기가같이 커짐

char test3[] = { 'h','e','l','l','o' }; 는

hello가 메모리 어딘가에 생성되는게아니 그냥 하나식 test3 배열에 옮겨짐

이게 맞나요?

그리고 Hello World가 임시적으로 어딘가에 생성되던데

왜 그렇게 되는건가요 test3케이스처럼 문자열도 그냥 하나씩 다 넣어버리는게 안되는건가요?

답변 5

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 거의 맞습니다.

char test2[]의 Hello World 는 둘다 .data영역에 생성

이 부분은 컴파일러에 따라 다를 수 있습니다.
그냥 test2에 h e l l~ 이렇게 하나 하나 채우는
어셈 코드로 만들어질 수도 있습니다.

Windfall님의 프로필 이미지
Windfall
질문자

늦은시간까지 감사합니다!

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

const char* test1 = "Hello World";
Hello World가 메모리 어딘가에 생성되고
test1은 그저 Hello World가 어디있는지만 알려줌
포인터이기 때문에 4바이트 or 8바이트

-> 그 메모리 '어딘가' = 데이터 영역입니다.

char test2[] = "Hello World";
Hello World가 메모리 어딘가에 일단 생성됨

-> 이번엔 메모리 '어딘가' = 스택입니다.

Hello World가 있는곳을 찾아서 4바이트씩 끊어서 계속
test2 배열에 넣어줌 그래서 문자열의 크기가 커지면 크기가같이 커짐

-> 아닙니다. 4바이트가 아니라 char은 1바이트 이기 때문에
'H' 'e' 'l' ... 등을 각각 복사해주고 각 1바이트입니다.
사실상 test3 케이스와 유사하게 동작합니다.

char test3[] = { 'h','e','l','l','o' }; 는
hello가 메모리 어딘가에 생성되는게라 그냥 하나식 test3 배열에 옮겨짐

-> 네 어셈블리를 까보면 스택에 'h' 'e' .. 한 글짜씩 복사됩니다.

그리고 의문이 생길 땐 어셈블리로 까보는걸 추천 드립니다.
그래야 공부도 되고 오래 남습니다.

0

Windfall님의 프로필 이미지
Windfall
질문자

그러면 const char* test1 의 Hello World와

char test2[]의 Hello World 는 둘다 .data영역에 생성

data영역에는 전역변수, 정적변수가 들어간다고 알고있는데

문자열이 const char라서 전역, 정적변수가 아님에도 불구하고 그냥 rodata로 들어가서 data영역 안에 생성되는건가요?

그리고 const char*형 test1과 char배열형 test2자체는 스택에있다

제가 이해한게 맞나요?? 

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

char test2[] = "Hello World"

아 좀 오해하기 쉽게 답변 드린 것 같은데
"Hello World" 문자열 자체가 스택에 생성된다는 의미는 아니고,

test2 배열이 스택에 있고, H e l l o~ 문자가 해당 배열에 하나씩 복사가 됩니다.

0

Windfall님의 프로필 이미지
Windfall
질문자

const* int test1 = "Hello World"

-> Hello World가 data영역에 생성

char test2[] = "Hello World"

-> Hello World가 스택에 생성

왜 이런 차이가 나는지 잘 모르겠습니다...

그냥 변수자체 포인터 변수 test1, test2는 스택에 들어간다는건알겠는데 왜 

오른쪽에 있는 Hello World는 생성 영역에 차이가 있는지 잘 모르겠습니다.. ㅠㅠㅠㅠ

어셈블리는 계속해서 보고있습니닷!

Windfall님의 프로필 이미지
Windfall

작성한 질문수

질문하기