#include <stdio.h>
int main(void)
{
char* p="abcd";
printf("%s",p);
return 0;
}
============================================================================
보통 제가 알기로는 밑에 과정인줄 알았거든요...
변수 선언 (ex) char c = 'a'
-> 컴퓨터가 &c라는 주소에 메모리 할당해서 아스키코드의 알파벳 a를 넣어줌.
-> 포인트 변수 선언하고 변수c 주소 &c를 초기값으로 정해줌. (ex) char* p = &c
-> printf("%c",p); 해주면 출력을 해줌.
근데 맨 위의 코딩을 살펴보면... 변수선언이 없어요...
변수선언이 없이 코딩이 잘 돌아가는게 신기하네요...
포인트 변수는 기본적으로 변수의 주소를 가지고 작동하는줄 알았는데...
변수선언없이 갑작스레 문자열을 주소로 저장해서 실행이 되니...
작동원리가 이해가 안되요.
알아서 쳐넣고 주소도 넣어줌
선언햇네
char str[] = \"abcd\" 이건 str변수에 5바이트 메모리를 할당하는거고 char* str=\"abcd\" 이건 프로그램에 메모리가 잡힘(한번만) 그래서 char* str1=\"abcd\", str2=\"abcd\" 이 두 변수가 가리키는 주소가 같다. 그리고 이 메모리는 읽기권한밖에 없음. idata 섹션인가? 암튼 거기에 잡힘
처음 실행파일이 시작될때 \"abcd\"가 스택에 할당되고, char *p = \"abcd\"라는 코드가 실행될때 p라는 char포인터가 힙에 할당되면서 \"abcd\"의 주소가 들어감.
먼저, \"abcd\"라는 걸 문자열 리터럴이라고 하는데, 그건 수정불가능한 데이터 형태야. 이게 프로그램(혹은 프로세스)이 로드될 때 메모리 세그먼트라는 게 있는데, 코드 들어가는 영역, 지역 변수 들어가는 영역, 동적 할당 변수 들어가는 영역, 상수 들어가는 영역 등 서로 다르게 구분되어 있어. 그중에 리터럴은 데이터 세그먼트라는 데 들어가는데, 그중에서도 리드-온리, 즉 변경 불가능한 데이터가 들어가는 곳에 할당되지.
그리고 char형의 포인터(지역변수, 스택에 들어감)를 선언해서, \"abcd\"라는 문자열 리터럴이 저정된 주소를 그 p라는 변수에 할당해주는 거니까, 이상할 거 하나도 없는 구문이지.
ㅆㅂ 낚인 것도 모르고 괜히 열심히 썼네 ㅋㅋㅋㅋㅋ