61.2 질문입니다.
, dsds dsfs님이 작성838p의
int *ten(){
int num1 = 10;
return &num1;
}
*ten()이라는 함수안의 num1이라는 변수가 지역변수이기 때문에, 지역변수를 반환하면 안된다는게 이해갑니다.
하지만
840p의
char *helloLiteral()_{
char *s1 = "Hello, world!";
retunr s1;
}
에서의 s1도 main함수의 밖에서 존재하고 helloLiteral()이라는 함수안에서만 존재하는 변수이기때문에 지역변수라고 생각하는데,
여기 설명에서는 "문자열 Hello world!는 메모리에 저장되어 있으므로 사라지지 않음" 이라고 되어있는데... 여기서의 s1도 지역변수이므로 전자의 경우처럼 지역변수를 반환하면 안되는것 아닌가요??
Re: 61.2 질문입니다.
, 도장_ 관리자님이 작성문자열 리터럴은 읽기 전용이고, 프로그램이 종료될 때까지 유지됩니다.
따라서 블록 {과 } 사이에 있다고 해서 범위를 벗어났다고 사라지지 않습니다.
문자열 리터럴은 읽기 전용이고, 코드와 함께 직접 컴파일됩니다. 따라서 저장 공간도 분리되어 있습니다. 보통은 .rdata 영역에 저장합니다. rdata의 r은 read-only를 뜻합니다.
일반적인 데이터는 data 영역이고, 블록 안에서만 유효합니다. int로 선언한 정수 등은 블록 범위를 벗어나면 무효화됩니다.
정수도 범위를 벗어나서 유효한 상태를 유지하고 싶다면 malloc으로 메모리를 할당하면 됩니다. 이는 예제로 설명되어 있습니다.