신기한 포인터 ㅡㅡ;;

Lipton의 이미지

const 로 변수를 선언한 다음에

포인터로 그 변수를 가리키고 값을 바꾸면 어떻게 되나 보았습니다.

#include <iostream>
using namespace std;

void main()
{
const int Num=10;
int *pNum = (int*)&Num;
*pNum = 100;
cout << Num << endl;
cout << *pNum << endl;
}

Num 변수를 const로 10으로 선언하고 pNum이 Num을 가리키게 해놓았씁니달

그리구 *pNum값을 100으로 수정하고 실행했습니다. GOGO~~

컴파일시에는 에러도 경고도 없네요? (VC++ 6.0)

결과:
10
100

값이 안바뀌길래 주소를 보았습니다.

pNum은 분명히 Num의 주소를 가리키고 있었습니다.

pNum에 100 값을 넣고 나서도 주소는 그대로이고

*pNum은 물론, Num까지도 100 으로 바뀌어 있었습니다.

근데 cout으로 출력하면 10 이 나오네요. 아왜~

디버깅창에 워치를 보면 값이 100인데... 출력하면 10이라니

Num과 pNum이 주소값이 같은데 하나는 10이 나오고 하나는 100이 나온다니

아따 신기하네요 ㅡㅡ;; 왜이런걸까요?

jyoung의 이미지

그건 아마도 compiler의 optimization때문이라고 생각이 드는데요.
Num이 const로 선언되었기 때문에, compiler가 Num을 상수라고 생각하고
Num이 사용되는 곳에서 Num을 그 상수 값으로 치환하게 되죠.
그래서

cout

  cout 

로 바뀌게 되니까, Num 자체의 값을 pointer를 이용해서 바꾸어 주어도 출력값은 10이 나오게 되겠지요.

될대로 되라지..

khiny의 이미지

#include

void main()
{
const int Num=10;
int *pNum = (int*)&Num;
*pNum = 100;
printf("%d\n",Num);
printf("%d\n",*pNum);
}

출력결과는:
100
100
이 나오네요. (VC++ 6.0)
컴파일러의 정책 차이겠죠?

cinsk의 이미지

먼저, void main()이 아니라 int main()입니다.
그리고 i = i++ + ++i;와 같이, undefined behavior이기 때문에, 고민할 필요없이, 그런 코드를 쓰지 않으면 됩니다.

C와 C++에서 const 참고 바랍니다.

아울러 C FAQ 11.3 The const qualifier도 참고바랍니다.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

Lipton의 이미지

상수여서 10으로 바꿔버린다는 jyoung님 말씀이 맞았습니다. !!

그리고 khiny님이랑 저랑 뭐가 틀린걸까요 저는 C로해도 똑같이 10, 100나오던데 ㅠ

심심해서 해본겁니다 ㅋㅋ const에 실수가 아닌이상 값을 넣을 이윤 없겠죠?^^

IDNed의 이미지

http://blog.naver.com/mtbmika?Redirect=Log&logNo=110001645388

어차피 그렇다면 C 상수제거 캐스팅이나 C++ 상수제거 캐스팅이나 같은 결과여서일듯...

즉 무적의 Undefined...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.