포인터 질문입니다.
글쓴이: kernelbomb / 작성시간: 월, 2004/02/16 - 6:40오후
음... 포인터 다 잊어 먹은거 같네요. ㅜㅜ;
다름이 아니오라 아래와 같은 코드에서 출력이 ab로 나와야 하는것
아닌가요? a만 출력되니... 친구넘이 한 번 맞춰 보라고 해서 해봤는데
많이 헷갈리네요. ㅜㅜ;
int main(void)
{
int *p = (int *)malloc(3 * sizeof(int));
*p = 'a';
*(p + 1) = 'b';
*(p + 2) = 0;
printf("%s\n", p);
return 0;
}Forums:


sizeof(int)는 2 ~ 4bytes를 가집니다.따라서 int
sizeof(int)는 2 ~ 4bytes를 가집니다.
따라서 int *는 2혹은 4씩 증가하겠죠.
거기다가 1byte의 char를 넣으면
a NULL b NULL NULL NULL 같은식으로 메모리에 들어가겠죠.
그걸 printf하니까 당연히 a만 출력되겠죠. ^^;
x86 cpu니깐 그나마 a라도 찍힌겁니다. :)
x86 cpu니깐 그나마 a라도 찍힌겁니다. :)
Re: 포인터 질문입니다.
4byte 단위로 끊어서 설명해 볼께요.
먼서 int로 sizeof 했구, (int*)로 케스팅 했으니깐, 0000 0000 0000 이만큼 할당 됐겠죠? *p 는 저중 처음 4바이트 가르킬 테니깐.. 'a'000 0000 0000 이 될테구, *(p+1) 은 두번째 4바이트를 가르킬 테니깐.. 'a'000 'b'000 0000 *(p+2) 는 굳이 안해두 되겠네요. p를 출력했으니깐.. 그런데 저걸 스트링형으로 출력을 하니깐.. 'a' 하나 출력한 후에 0이니깐... '\0'으로 알고 끝난 스토리.. 이렇게 바꾸시면 ab 다 출력될 것입니다. *p = (int)'a'; *((char*)p+1) = 'b'; *((char*)p+2) = 0;친구분이 약간의 장난( ? )을 치셨군요. :wink:
char* 을 int* 살~짝 바꿔서 헷갈리게..
[code:1]int main(void) {
int main(void) { int p[2]; p[0] = 0x41424344; p[1] = 0; printf("%s\n", p); return 0; } 결과 DCBAa가 왜 처음에 들어가는지 몰랐는데 int는 byte단위로 끊어 거꾸로 집어 넣네요.
위에 x86이라 a만이라도 찍혔다는건 이걸두고 하신 말씀이었군요.
댓글 달기