개발자
인스타 릴스보다가 봤는데용 이게 왜 cba로 나오는지 설명해주시면 감사하겠습니다!!!
답변 1
인기 답변
삭제된 사용자
2024년 02월 21일
안녕하세요. 부족한 지식을 동원해보자면,,(틀릴 수도 있습니다.) 4번 코드의 'abc'는 문자열이 아닌 multi-character constant로 int값으로 변환됩니다. 그런데 이 multi-character constant가 저장되는 방식이 컴파일러, OS, 아키텍처 등의 구현에 따라 결정됩니다. 위 사진은 little-indian 방식을 따른 것으로 보입니다. 그러므로 가장 작은 자릿수인 c가 아스키코드에 따라 변환된 1byte 숫자가 가장 작은 주소에 저장되며, 순서대로 b, a가 저장됩니다. 그런데 %s 서식지정자로 &c를 읽는다면 c에 저장된 값을 char 배열로 읽게 됩니다. 그러므로 가장 작은 주소부터 byte 단위로 끊어 읽게 되며 cba가 됩니다. 추가로, c의 값을 %x 서식지정자(16진수)로 출력해보시면 616263이 출력됩니다. 61, 62 63은 각각 a, b, c의 아스키코드 숫자값입니다. **추가: 참고로 이전 단락에서 말씀드린 것처럼 'abc'=0x616263입니다. 즉, 3개의 문자에 대한 값을 저장한 후 상위 8bit는 0으로 패딩된 것이죠. 그래서 문자열로 읽을 때 a까지 출력하고 널 문자를 읽은 게 돼서 printf가 정상 종료됩니다. 아래 자료 참고 바랍니다. Multi-character literal : https://www.geeksforgeeks.org/multi-character-literal-in-c-cpp/ 첫번째 답변에 환경 별로 multi-character constant 값 비교 : https://stackoverflow.com/questions/6944730/multiple-characters-in-a-character-constant 도움이 되셨길 바랍니다.
익명
작성자
2024년 02월 21일
감사합니다!!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 02월 21일
코드 자체가 제공되지 않아서 특정한 시나리오를 가정하고 질문에 답변드리겠습니다. 아마도 이를 설명하는 가장 간단한 예제는 문자열에 대한 포인터 연산이 될 것입니다. C언어에서, 문자열은 문자의 배열로, 그리고 배열은 메모리상에서 연속적인 위치에 배치됩니다. 배열의 이름은 실제로 첫 번째 원소의 주소, 즉 포인터입니다. 예를 들면: ```c char *s = "abc"; ``` 여기서 's'는 변수 "abc"의 첫 번째 문자 'a'를 가르키는 포인터입니다. 만약 다음과 같이 코드가 작성되었다면: ```c printf("%c", *(s+2)); ``` 실행 결과는 'c'가 됩니다. 왜냐하면 (s+2)가 문자열의 세번째 원소('c')를 가리키고 있기 때문입니다. 만약 어떤 코드가 이런 방식으로 문자열을 거꾸로 출력한다면 (즉, 끝에서부터 시작해서 거꾸로), 사용자가 본 "cba" 결과가 나올 수 있습니다: ```c for (int i = strlen(s)-1; i >= 0; i--) { printf("%c", *(s+i)); } ``` 위 코드는 "abc"를 "cba"로 뒤집어 출력합니다. 물론 이 설명은 여러분이 본 코드의 정확한 동작을 가정하는 것이며, 실제 코드를 봐야 완전히 정확한 답변을 드릴 수 있습니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!