구조체 포인터 질문합니다 도와주세요.

익명 사용자의 이미지

예를 들어서
typedef struct {
char name[10];
int age;
}human;

human person1,person2;

if(person1==person)
위와 같은 전체구조의 동등성을 검사할때 구조체에 포인터가 있으면
이렇게 사용하지 말라고 하는데 왜그런거죠??
도와주세요 고수님들

익명 사용자의 이미지

?!

1. 애초에 C언어에서는 두 구조체 인스턴스를 == 연산자로 비교할 방법이 없습니다.

2. C++에서는 가능하긴 한데, operator==를 직접 구현해야 하지요. 구조체에 포인터 필드가 있든 없든 프로그래머가 적절히 상황과 필요에 맞게 구현해야 합니다.

익명 사용자의 이미지

ansi c에서는 구조 치환이 가능하다고 들었습니다.구조의 모든 필드값을 대응된 필드 값으로 치환할때요.
근데 구조체 필드에 포인터가 있을때는 쓰지말라고하는데 왜그런지 모르겠네요....

jick의 이미지

되는 건 person1=person2 이거죠.

person1==person2 이건 C에서 안됩니다.

익명 사용자의 이미지

구조체안에 포인터든, 그냥 포인터든 치환을 하려면 memcpy같은 함수로 메모리복사를 해야 하지 않을까요?
포인터간에 = 는 메모리 주소값만을 치환하기에 치환된 변수에서 값을 건드리면 값이 같이 변합니다

익명 사용자의 이미지

그게 질문이라면, 그렇게 질문해야지요.

네. C/C++ 모두 별도의 코드 없이, initialization이나 assignment를 이용해서 구조체 전체를 복사할 수 있습니다.

문제는...

1. 대부분의 사람들은 뭔가를 복사할 때, 원본과 사본이 복사 직후에는 동일하지만, 그 이후에는 서로 독립적인 객체일 것이라고 생각합니다. 즉 복사가 끝난 뒤에 원본이나 사본 중 하나에 어떤 조작을 가하더라도 다른 하나에는 영향을 주지 않을 거라고 생각하죠.

2. 구조체가 포인터 필드를 가질 경우, 해당 포인터의 "논리적인 구성 요소" 일부를 포인터 필드가 가리키고 있는 경우가 많습니다. 이 경우, 단순하게 필드 단위 복사만 한다면 원본과 사본은 포인터 필드가 가리키는 부분을 공유하므로, 서로 독립적이지 않게 됩니다.

그런 경우에 제대로 복사를 하려면 포인터 필드만 복사하고 끝내는 게 아니라, 포인터 필드가 가리키는 대상 자체를 복사해서 사본에게 주어야 합니다.

결국 구조체의 사본을 만든다는 건 경우에 따라 상당히 non-trivial한 일이 될 수 있는데, C++에서는 이런 로직을 복사 생성자와 대입 연산자를 직접 작성함으로써 나타낼 수 있습니다. C언어에서는 그런 게 없으니 그냥 별도의 함수로 짜는 수밖에요.

이걸 얕은 복사(shallow copy) vs. 깊은 복사(deep copy)의 문제라고 표현하기도 하는데, 이렇게 검색해 보면 다양한 설명들이 있을 겁니다.

흠의 이미지

뭔 소리예요. c와 c++ 왔다 갔다 하네요. c에 객체가 어딨어요?

익명 사용자의 이미지

일반적인 의미에서의 "객체", 즉 어떤 행위나 작용의 대상이 되는 것을 말합니다.

해당 문장은 C/C++ 등 프로그래밍 언어와 관련된 맥락이 아니라, 일반적으로 사람들이 "사본을 만든다"고 할 때 원본과 사본에 대해 어떤 성질을 기대하는지를 말하려고 했던 것이었습니다. 혹시 이해가 안 되는 부분이 있는지요?

그리고, 조금 다른 이야기입니다만 C언어에도 object라는 개념이 있습니다. 이 용어를 우리말로 어떻게 옮기는지가 문제인데, "대상체"라는 번역어도 본 적 있어요. 하지만 저는 "객체"라고 옮겨도 딱히 문제는 없다고 생각합니다.

댓글 달기

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