작성
·
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
네 거의 맞습니다.
char test2[]의 Hello World 는 둘다 .data영역에 생성
이 부분은 컴파일러에 따라 다를 수 있습니다.
그냥 test2에 h e l l~ 이렇게 하나 하나 채우는
어셈 코드로 만들어질 수도 있습니다.
1
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
그러면 const char* test1 의 Hello World와
char test2[]의 Hello World 는 둘다 .data영역에 생성
data영역에는 전역변수, 정적변수가 들어간다고 알고있는데
문자열이 const char라서 전역, 정적변수가 아님에도 불구하고 그냥 rodata로 들어가서 data영역 안에 생성되는건가요?
그리고 const char*형 test1과 char배열형 test2자체는 스택에있다
제가 이해한게 맞나요??
0
char test2[] = "Hello World"
아 좀 오해하기 쉽게 답변 드린 것 같은데
"Hello World" 문자열 자체가 스택에 생성된다는 의미는 아니고,
test2 배열이 스택에 있고, H e l l o~ 문자가 해당 배열에 하나씩 복사가 됩니다.
0
const* int test1 = "Hello World"
-> Hello World가 data영역에 생성
char test2[] = "Hello World"
-> Hello World가 스택에 생성
왜 이런 차이가 나는지 잘 모르겠습니다...
그냥 변수자체 포인터 변수 test1, test2는 스택에 들어간다는건알겠는데 왜
오른쪽에 있는 Hello World는 생성 영역에 차이가 있는지 잘 모르겠습니다.. ㅠㅠㅠㅠ
어셈블리는 계속해서 보고있습니닷!
늦은시간까지 감사합니다!