1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /* char str[30]; scanf("%s", str); 여기서 scanf("%s", &str); 이 아닌이유는 str자체가 str[0]의 주소값을주는거라서 그렇잖음 ? 책봐도 &str이라고 사용해서는 안된다!라고 얘기를하고. 근데 실제로는 char str[30]; scanf("%s", &str); 로 작성을하고 사용해도 딱히 워닝도 안뜨고 결과도 같음.제대로 잘 작동함 어떤구조라서 잘작동이되는거고 왜 사용해서는 안되는건지...? */ | cs |
예전에 물어봤던건데 까먹어서... 질문좀..
흐린바다(1214qwer)
2016-04-18 20:37
추천 0
댓글 54
다른 게시글
-
이거 왜 에러뜨는거임? [6]익명(59.24) | 16.04.18추천 0
-
8분후면 면접인데 개씨발 존나 피곤하다 [1]누텔라볶음..(112.171) | 16.04.18추천 0
-
프로그래머지망생인 분들을 위한 프로그래머가 되는 방법 [1]익명(103.10) | 16.04.18추천 0
-
혹시 virtualbox에서 웹서버 띄워본사람있냐??? 여기접속왜안되냐 [9]익명(119.106) | 16.04.18추천 0
-
테트리스 소스코드 봤는데 [3]오타쿠(123.109) | 16.04.18추천 0
-
프로그래머가 되려면 문과로 가십시오 [1]익명(112.170) | 16.04.18추천 0
-
프로그래머가 되고싶은데 문과가 유리한가요 이과가 유리한가요? [8]mozzart(mozzart) | 16.04.18추천 0
-
어제 에러나서 자고 일어나서 컴터 켰더니 에러가 사라짐 [3]개오복(gaeobok) | 16.04.18추천 0
-
비가 옵니다 [1]mozzart(mozzart) | 16.04.18추천 0
-
형들 윈도우 크랙버전에서 비쥬얼스튜디오 안되나요? [2]asfd(220.79) | 16.04.18추천 0
그건 str 이 배열이기 때문이죠. 배열은 곧 상수포인터니까.
상수 주소에 주소를 취해도 아무 문제가 없어요. 문제는 변수일 때 발생하죠.
상수 주소에 대한 주소 연산은 그냥 무시되거든요.
&str;의 의미는 str[0]의 주소값의 주소값이라는소리아님? 결국엔 str[0]의 주소값이라는건 같은얘기고. 그래서 동작자체는 잘된다..라고 생각하고있긴한데 어떨때 어떤식으로문제가있다는?
char str[]같은경우는 변수잖아? char형 배열 변수. 상수가아니잖아. 그러니 저런식의 사용도 결과적으로 결과는맞고 사용해도 문제는 없다가 맞는거아님? 사용해서는 안된다! 라는 표현이있다는건 뭔가 이유가 또 있는거같아서
아 추가로 상수주소에대한 주소연산이 무시된다는것도 몰랐는데 ㄳ
누가 저거 정의되지 않은 기능이라고 했던거 기억나는데
str 이 &str;[0] 이고, 위에 str[0]의 주소값의 주소값이라는 소리 아님? 이라고 한 말은 틀린거.
세미콜론이 왜 엉뚱한데서 튀어나오지
ㅋㅋ 뭔소린가했네 디시에서 필터링되서 그런듯 한글로그냥쳐주셈
char str[] 가 함수에서 사용되었다면 [] 만큼의 지역변수가 스택에 만들어지지만, 그 시작주소 자체, 즉 상수가 str 이 되는거라 str 자체엔 값을 대입할수 없죠. 그래서 상수포인터라는 것
상수 포인터는 변수가 아니라 메모리공간의 위치를 참조해 주소를 가져오는 연산이 불가능하죠. 그래서 & 를 해도 원래의 주소가 그대로 나오는 것
다시 말하지만 str[] 은 변수지만 str 은 상수입니다. 배열 표현에서요
str[0] 는 변수의 저장공간을 의미하고, & 를 붙여서 그 주소를 가져올 수 있지만
str 은 상수를 의미하고 & 를 붙여도 주소를 가져올 수 없어 그 값 그대로가 쓰이게 됩니다.
아 str이라는게 주소값 상수라고 표현하면 맞나?
만약 char* str2 = str; 이렇게 한줄 더 선언하고 쓴다면,
ㅇㅇ
str[0]은 저장공간이고, 배열표현에서 str의 의미는 str[0]의 주소값을 나타네는 상수이다
좋은 개념 가르쳐주기다..
str2 를 인자로 넘겨서 주소 처리를 하는건 말이 되지만 &str2; 를 하면 망하겠죠?
그런의미에서라면 왜 저경우는 잘동작하는것임? 저경우도 동일한거아님? str은 상수이고 상수의 주소값을 표현하는데 왜 정상적인결과가출력?
str2 에는 str 을 대입했으니 원래의 주소값이 들어있지만, str2 의 저장공간이 있는 주소 자체엔 배열 만큼 메모리가 확보된게 아니니까요.
시작주소로부터 n 개의 요소가 할당이 되어 있는 경우랑, 주소만 딸랑 받아 처리하는 공간의 차이죠.
&str;의 의미는 str은 str[0]의 주소값을 가지고있는상수이고 &str;은 그 상수의 주소값을 나타내는것아님? 그 상수의주소값에다가 scanf로 받아서 쓴다는게 말자체가안되잖아? 상수는 수정불가인데
sizeof( str ) 은 n 바이트지만, sizeof( str2 ) 는 4 바이트 잖아요. 32비트에서
아니죠. scanf 가 받아들이는건 그냥 주소 값이죠.
ㄴㄴㄴ str2얘기말고 제가 올린질문에경우
call-by-value
값만 복사할 뿐, str 이 아닌 복사된 스택의 시작주소를 참조하는 것 뿐이라서
원래 전달된 파라메터가 상수냐 변수냐는 의미없죠.
scanf로 내가 abcd를입력했다치자. 그럼 "abcd"라는상수가 어딘가에 메모리할당이되고, 이상수의 주소값을 쓴다는거아냐? 근데 &str;로 할경우에는 str이라는 상수에다가 쓴다는건데 그게 말이안되지않냐는 생각
그러니까 변수를 넘기든 상수를 넘기든 scanf 는 그걸 그냥 주소값이라고 생각하고 그 주소에다 입력값을 적어넣어주는 구조인데
아직 제 말 뜻을 이해하지 못하신것.
하나 하나 예로 들죠. char buffer[256]; 이라고 선언했다 치죠.
scanf("%s", buffer); 를 수행하면,
buffer 는 지역변수 선언일 경우 스택의 어딘가의 연속한 256 바이트를 할당하고, 그 시작주소 상수값 자체를 의미하게 되죠.
그 상수값이 scanf 에 전달됩니다.
scanf 는 format specifier 를 읽어서 인자가 전달된 스택으로부터 %s 에 해당하는, 문자열의 주소를 추가로 읽어들이죠.
그 주소를 시작으로 stdin (키보드) 로 입력된 문자열을 하나씩 적어 넣는거죠.
이때 buffer 가 상수이든 변수이든 중요하지 않아요. 값만 복사되기 땜에.
그때 &buffer; 를 넘긴다고 해도, 그 주소 자체에서 변하질 않죠.
그런데 만약, char* buffer2 = buffer; 라고 선언했고, buffer2 를 scanf 에 전달할 경우
똑같이 동작하지만,
&buffer2; 를 전달하게 되면 buffer2 가 있던 4바이트 변수의 주소를 전달하게 되는데
즉 4바이트 밖에 할당되지 않은 공간이 전달된다는거죠. 256바이트의 공간이 아닌 buffer2 포인터를 저장하기 위한 공간 말이죠.
그러면 4바이트 이상의 입력을 받을 경우, 포인터 변수의 영역을 넘어 다른 지역변수를 건드리게 되죠
그래서 좆망한다는 이야기예요
설명해주신거좀만더읽어보고 생각좀해볼게요
그림을 그려보면 간단하죠
새 글로 쓸게요
좆도 허접한 디씨프겔에서 이런거 묻지마라 좆도 실무 뗘본적도 업싱 책으로만 공부해본 좆쵸보새끼들이 미쳐날뛰는곳이네 ㄲㄲ
자이니치가 또
요약하자면 상수주소의 주소연산은 무시되기때문이다 아님?