[C++] char *a="co",*b="co"; 이면 a==b?

gyxor의 이미지

#include <iostream> 
using namespace std;

int main() 
{ 
        char *a = "cool"; 
        char *b = "cool";

        cout << (int)a << endl;
        cout << (int)b;
        return 0; 
} 

결과는
4632604
4632604

이었습니다. 좀 이해가 안됩니다.
(단,문자열의 내용이 달라지면 주소값도 달라졌습니다.)
data segment에 스트링을 저장할때에 그 내용까지 검사해서
중복인경우에 변수가 같은 주소를 가지도록 하는 구현이 들어가
있는것인가요?
설명 부탁드립니다.

죠커의 이미지

최적화입니다.
옵션이나 임플레멘테이션(구현)에 따라 달라집니다.

lsj0713의 이미지

같은 내용을 갖는 문자열 상수(String Literal)는 하나만 만들어질 수도 있습니다. 어차피 문자열 상수는 수정이 불가능하므로 같은 내용이라면 굳이 여러개를 만들 필요가 없습니다.

gyxor의 이미지

최적화였군요.. ^^;

찬밥의 이미지

오.. 신기 하네요..
그래서 제가 다르게 만들어봤는데요..

#include <stdio.h>

int main()
{
        char *a = "cool";
        char *b = "cool";

        printf("%p\n", a);
        printf("%p\n", b);

        scanf("%s",&b);

        printf("%p\n", a);
        printf("%p\n", b);

        scanf("%s",&a);

        printf("%p\n", a);
        printf("%p\n", b);

        return 0;
}

출력1-------------------
10758
10758
aaaa
10758
61616161
bbbb
62626262
61616161

출력2---------------
10758
10758
aaaa
10758
61616161
aaaa
61616161
61616161

이런 경우..
scanf 받을때마다 새로운 주소를 할당받는데요..

그럼 이 입력받을때마다..
메모리의 모든 곳을 검색하고 같은 값을 갖는 곳이있나 확인하고
만약 같은 값을 갖는 곳이있으면 그 주소를 할당하고
같은 값을 갖는 곳이 없으면 새로운 주소를 할당하는 건가요?

mithrandir의 이미지

찬밥 wrote:
오.. 신기 하네요..
그래서 제가 다르게 만들어봤는데요..

#include <stdio.h>

int main()
{
        char *a = "cool";
        char *b = "cool";

        printf("%p\n", a);
        printf("%p\n", b);

        scanf("%s",&b);

        printf("%p\n", a);
        printf("%p\n", b);

        scanf("%s",&a);

        printf("%p\n", a);
        printf("%p\n", b);

        return 0;
}

출력1-------------------
10758
10758
aaaa
10758
61616161
bbbb
62626262
61616161

출력2---------------
10758
10758
aaaa
10758
61616161
aaaa
61616161
61616161

이런 경우..
scanf 받을때마다 새로운 주소를 할당받는데요..

그럼 이 입력받을때마다..
메모리의 모든 곳을 검색하고 같은 값을 갖는 곳이있나 확인하고
만약 같은 값을 갖는 곳이있으면 그 주소를 할당하고
같은 값을 갖는 곳이 없으면 새로운 주소를 할당하는 건가요?

만약

scanf("%s",&a);
printf ("%s\n", a);

해보신다면 segmentation fault가 떨어지는것을 알 수 있습니다.

scanf는 입력받은 내용을 버퍼에 복사하는 것이지, 할당해서 포인터를 넘겨주는것이 아닙니다.
같은 내용을 (입력받은 문자) 복사 했으므로 같은 값이 나오지만 그것이 사실은 포인터가 아니라 문자 내용인것이지요.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

댓글 달기

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