
#include <stdio.h>
int main(void)
{
char *s="EMMA";
char *t="EMMA";
printf("%p\n",s);
printf("%p\n",t);
printf("%c\n",*s);
printf("%c\n",*t);
if(s==t){
printf("same");
}
else{
printf("diff");
}
}
이런 식으로 입력하면 s와 t의 시작 포인터 주소값이 같게 됩니다. 영상에서는 EMMA를 입력할때마다 포인터의 주소가 달라졌는데, 여기서는 왜 같게 나오는지 궁금합니다. s와 t의 주소가 다르게 출력될것이라 예상했었습니다.
comment
영상에서는 cs50이라는 컴파일러로 컴파일 했습니다. ide마다 컴파일러가 다른데
이 코드에서 s와 t의 포인터 주소가 같이 출력되는 이유는 컴파일러 최적화 때문입니다.
선생님의 코드에서 s와 t 두 개의 문자 포인터가 각각 "EMMA"라는 동일한 문자열을 가리키고 있습니다. 이 경우 일부 컴파일러들은 두 포인터가 동일한 문자열을 참조하고 있다는 것을 감지하고 메모리 공간을 효율적으로 사용하기 위해 하나의 문자열 인스턴스에 대한 주소를 여러 포인터에 할당할 수 있습니다.
즉, 컴파일러가 s와 t 모두 같은 "EMMA" 문자열을 가리키게 하여 메모리 공간을 절약하는 최적화를 수행하고 있는 것입니다. 이 최적화로 인해 이 예제에서는 s와 t의 주소값이 동일하게 출력됩니다.
만약 다른 컴파일러를 사용하거나 최적화 옵션을 변경하면 예상대로 포인터의 주소값이 다르게 출력될 수 있습니다.
저런식으로 문자열을 하드코딩하게 되면 같은 문자열일 경우 변수를 다르게 선언해도 같은 주소를 가르킵니다. 때문에 문자열을 다르게 하시면 다른 주소값에 할당 되는 것을 확인 하실 수 있습니다.
또 강의에서는 get_string()을 통해 값을 받아왔는데 이 함수 과정에서 주소값이 할당 되기 때문에 각각의 다른 함수 처리 과정에서 주소값이 다르게 나오는 것입니다.
저도 이게 이해가 안 가서 못 넘어가고 있네요.. get_string 안 쓰고 직접 선언하면 주소값이 같게 떠요
저도 해봤는데 같게 나오더라고요. 왜 그런지 궁금합니다