캐스팅 연산으로 정수타입을 포인터타입으로 바꾸는법...
글쓴이: sjg0120 / 작성시간: 수, 2006/11/22 - 8:43오후
프로그램 작성하는 중에 벽에 부딪혔습니다. ㅜㅜ
int형인 temp인 변수의 값을 (char *) 타입으로 바꾸는 방법이 없을까요??
캐스팅 연산을 통해
char *name = (char *)temp; // 참고로 temp에는 다른곳에서 (char *)타입의 값을 int형으로
// 가지고 있습니다. 이곳만 손보면 편한데 사정상 바꿀수가 없어요ㅜㅜ
이런식으로 하고 printf를 통해 %p인수를 줘서 찍어 봤는데 0x1bc0와 같은 주소 비스무리한
형태로 출력이 됩니다. 그런데 이안에 있는 문자열을 출력하려고 %s를 사용하면 세그먼트 폴트가
일어납니다... 아무래도 값만 포인터 비슷하게되고 실제 주소를 가리키는 기능은 못하는것 같습니다.
제가보기엔 될듯 하기도 한데 안되네요 ㅡㅡ;
혹시 방법이 있다면 조언해 주시면 감사하겠습니다~
Forums:
char *name = (char
char *name = (char *)(&temp);
인 듯 하네요.
그런데
그렇게하면 temp라는 변수의 주소를 가리키게 되지않나요?
temp라는 변수에 0x1f238721 라는 값(주소가 아님) 이 있을때
이것을 캐스팅하여 포인터 변수에 넣어서 실제 주소처럼 사용할수 있는지
이것이 궁금합니다.^^
무슨 이유로 필요하나요?
아직껏 그런 것이 필요한 이유를 모르겠군요.
사용하시는 library 가 괴상한 것인가요?
프로젝트중에....
지금하고있는 프로젝트중에 나초스라는 것이 있는데 이것이 리눅스상에서 Mips 코어를 에뮬레이트
해서 돌아갑니다. 근데 Mips코드내 함수의 아규먼트를 에뮬레이트된 레지스터에 받아오는데
이때 이 레지스터의 타입이 int형입니다. 여기서 문자열 상수의 포인터를 넘기는 방법을 생각하던 중에
좋은 방법이 없을까해서 질문을 올렸습니다.
이런
이런 식인가요?
제 경우 포인터 사이즈가 8 바이트인데 int 가 4 바이트 입니다. 주소 넘어가는 경우 바로 죽습니다. 사이즈를 정확히 넣어주세요.
캐스팅 상의 문제는
캐스팅 상의 문제는 아닌 것 같습니다. C언어에서는 정수형과 포인터형 사이의 캐스팅이 허용됩니다.
그 허용범위가 구현체에서 정의되는(implementation-defined) 사항이긴 하지만, 지금은 그게 문제인 것 같지는 않군요.
주소값을 받는 쪽에서 주소값을 보내는 쪽의 메모리 영역에 접근이 허용되는지는 확인해 보셨나요?
주소값이 제대로 넘어가지 않아서 문제인게 아니라, 받아온 주소값이 가리키는 메모리에 접근할 수 없어서
생기는 문제 같습니다.
답변 감사드립니다.
해결되었습니다 문제는 캐스팅이 아니라 메모리구조때문이었네요
에뮬레이트해서 돌리는거라 실제 사용중인 컴퓨터 메모리를 사용하는 줄알았는데
에뮬레이트해서 쓰이는 메모리가 따로있었네요
답변감사드립니다~
댓글 달기