char str[]이 전역변수인경우

str, str[0] : 데이터영역에 할당됨, 둘이 같은주소임


char str[]이 지역변수인경우

str, str[0] : 스택영역에할당됨, 둘이 같은주소임


-----------------

즉 str이라는 배열의 변수명이 따로 어디 할당되서 포인터상수니 뭐니 하는건 아닌것

밍고스설명에나온 포인터가 아니라는말도 


배열 이름과 포인터는 다르다. 다만 배열 이름이 몇몇 상황에서 포인터로 암시적인 형 변환(implicit type conversion)을 겪을 뿐이다.
이러한 변환을 붕괴(decay)라고 한다.


라고 설명해줬는데 배열이름 != 포인터 인거고 암시적형변환이나 붕괴에관한건 아직 잘은몰라도 함튼

배열이름 != 포인터


1. 블로그설명은 틀림

2. 책설명은 맞긴한데 문맥상으로 오해의 여지가있다고봄

   리터럴상수같은것도 메모리에 할당이 되긴하는데 코드영역에 올라가는 이런것들도

   메모리 할당이라고 한다면~ 의 수준임.

   의미상제대로 보통 메모리에 할당되는 상수의경우는

   00FF2108에 할당되어있는 저런 문자열 상수같은경우만 가능



===================


다시 scanf로 돌아가서


scanf는 주소값을 받고 거기에 call by val로 받은값을 쓴다.


scanf("%s", str);     // 정석 / 결과 정상. scanf에 던져주는 주소값 = str의 주소값 = str[0]의 주소값 따라서 str[0]에다가 받은값을 써내려가기시작

scanf("%s",&str);    // 비정석 / 결과 정상. scanf에 던져주는 주소값 = 위와 같음. 그래서 결과도 같음

                        다만 전자는 char*의 주소값을 던져준거고 후자는 char (*)[] 의 주소값을 던져준거고

이 케이스에서는 전자던 후자던 sizeof char*index만큼을 넘어가면 문제가 생기는것도 동일하긴하지만


문제가 되는케이스는 char* str2 = str; 이런식일때 &str2로 줘버리면 str2의 크기는 char만큼인데

입력받는 자료가 char보다 클경우에 문제가 생긴다는것.




혹시 내가 잘못이해하거나 적은거나 부족해보이는거있으면 메차쿠차 태클좀