C++ Pointer 관련 질문인데요

cyrius11의 이미지

(첫 포스팅인데 제대로 안올라가서 다시 씁니다)
Pointer관련인데요. 제 머리로는 이해가 안되네요. 아래 코드에서 swap()함수에 cout문을 한번 쓰느냐 아니냐에 따라 결과가 틀려집니다. 왜 그런지 아시는 분 없나요?
참고로 (a)방식으로 하면 제대로 나오는데 (b)방식으로 하면 안됩니다. 단지 cout문이 있느냐 없느냐의 차이인데요...쩝 T_T

... 생략.....
int main()
{
... 생략 ...
int a, b;
a = 10;
b = 20;
swap(&a, &b);
cout

return 0;
}

void swap(int* a, int* b)
{
//방식 (1)
int* c;
*c = *a;
*a = *b;
*b = *c;
cout

//방식 (2)
int* c;
*c = *a;
*a = *b;
*b = *c;
}

sephiron의 이미지

우선 int* c의 할당이 안 이루어졌군요. 세그폴트는 안 나나요?

pung96의 이미지

int *c를 int c로 모두 바꾸고 해봤더니 두가지 모두 잘되는군요.. 당연한거지만.
안되는 이유는 모르겠습니다.
안되는건 어떻게 안되는건가요? (-> 질문 하실땐 항상 요것이 핵심입니다.^^)

태훈의 이미지

c를 생성하면 처음에 당연히 쓰레기값이 들어있습니다. 그 쓰레기값이 가리키는 주소에다가 값을 넣을려고 해서 정의되지 않는 동작이 발생합니다. 예를 들면 우연히 c안에 들어있는 쓰레기값이 커널영역 주소라서 커널영역에다가 값을 쓸려고하면 뻗어버리겠죠.

Just do it!

seank76의 이미지

꼭 포인터를 쓰실필요가 없다면 레퍼런스로 대체하시는게 이런 류의 실수를 방지해줍니다.

void swap(int& a, int& b)
{
int c;
c = a;
a = b;
b = c;
}

seank76의 이미지

갑자기 재밌는 스왑 방법이 기억이 나서 적어봅니다.

int a와 b를 스왑할땐 c가 필요없습니다.

a += b;
b = a - b;
a -= b;

singlet의 이미지

seank76의 이미지

"망치없이 못질"이라....

제가 a + b > MAX_INT 상황에선 쓰지 못한다는 제약을 깜박했군요.

죄송합니다.

only2sea의 이미지

포인터만 할당이 된 것이고 그 포인터가 가리키는 곳의 메모리가 할당되지 않았기 때문에 문제가 있는 코드입니다. 당연하지만 다음과 같이 해야 합니다.

int c;
c = *a;
*a = *b;
*b = c;

그럴 리는 없겠지만 꼭 int* c로 해야 한다면

int *c = new int;
*c = *a;
*a = *b;
*b = *c;
delete c;

이것처럼 할당을 하고 다시 제거하는 바보같은 짓도 할 수 있겠습니다.

이제는 서명에 무엇을 써야하는지 생각해보자.

cyrius11의 이미지

감솨합다~~~
꾸벅!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.