[c] C에서 한 구조체를 다른 구조체에 할당

다음과 같이 구조체의 한 인스턴스를 다른 인스턴스에 할당 할 수 있습니까?

struct Test t1;
struct Test t2;
t2 = t1;

나는 그것이 간단한 구조에서 작동하는 것을 보았습니다 .bu는 복잡한 구조에서 작동합니까?
컴파일러는 유형에 따라 데이터 항목을 복사하는 방법 (예 : int및 문자열 구분)을 어떻게 알 수 있습니까?



답변

구조가 동일한 유형이면 예입니다. 메모리 사본으로 생각하십시오.


답변

예, 구조체에 할당이 지원됩니다. 그러나 문제가 있습니다.

struct S {
   char * p;
};

struct S s1, s2;
s1.p = malloc(100);
s2 = s1;

이제 두 구조체의 포인터가 동일한 메모리 블록을 가리 킵니다. 컴파일러는 지정된 메모리를 복사하지 않습니다. 어떤 구조체 인스턴스가 데이터를 소유하는지 알기가 어렵습니다. 이것이 C ++이 사용자 정의 가능한 할당 연산자 개념을 발명 한 이유입니다.이 경우를 처리하기 위해 특정 코드를 작성할 수 있습니다.


답변

먼저이 예제를보십시오.

간단한 C 프로그램의 C 코드는 다음과 같습니다.

struct Foo {
    char a;
    int b;
    double c;
    } foo1,foo2;

void foo_assign(void)
{
    foo1 = foo2;
}
int main(/*char *argv[],int argc*/)
{
    foo_assign();
return 0;
}

foo_assign ()에 해당하는 ASM 코드는 다음과 같습니다.

00401050 <_foo_assign>:
  401050:   55                      push   %ebp
  401051:   89 e5                   mov    %esp,%ebp
  401053:   a1 20 20 40 00          mov    0x402020,%eax
  401058:   a3 30 20 40 00          mov    %eax,0x402030
  40105d:   a1 24 20 40 00          mov    0x402024,%eax
  401062:   a3 34 20 40 00          mov    %eax,0x402034
  401067:   a1 28 20 40 00          mov    0x402028,%eax
  40106c:   a3 38 20 40 00          mov    %eax,0x402038
  401071:   a1 2c 20 40 00          mov    0x40202c,%eax
  401076:   a3 3c 20 40 00          mov    %eax,0x40203c
  40107b:   5d                      pop    %ebp
  40107c:   c3                      ret    

할당이 어셈블리에서 “mov”명령어로 대체 된 것을 볼 수 있듯이 할당 연산자는 단순히 한 메모리 위치에서 다른 메모리 위치로 데이터를 이동하는 것을 의미합니다. 할당은 구조의 즉각적인 멤버에 대해서만 수행되며 구조에 복잡한 데이터 유형이있는 경우 복사에 실패합니다. 여기서 COMPLEX는 목록을 가리키는 포인터 배열을 가질 수 없음을 의미합니다.

구조 내 문자 배열은 대부분의 컴파일러에서 작동하지 않습니다. 할당은 데이터 유형을 복잡한 유형으로 보지 않고도 복사를 시도하기 때문입니다.


답변

이것은 당신이하는 것처럼 간단한 사본입니다 memcpy()(실제로 일부 컴파일러는 실제로 memcpy()해당 코드 에 대한 호출을 생성합니다 ). C에는 “문자열”이 없으며 한 묶음에 대한 포인터 만 있습니다. 소스 구조에 그러한 포인터가 포함되어 있으면 문자 자체가 아니라 포인터가 복사됩니다.


답변

실수와 허수 부분이있는 복소수에서와 같이 “복잡”을 의미 했습니까? “복잡함”은 C 언어와 관련하여 아무것도 의미하지 않으므로 예를 들어야 할 필요는 없습니다.

구조의 직접 메모리 사본을 얻게됩니다. 그것이 원하는 것인지는 구조에 달려 있습니다. 예를 들어 구조체에 포인터가 포함 된 경우 두 복사본 모두 동일한 데이터를 가리 킵니다. 이것은 당신이 원하는 것일 수도 아닐 수도 있습니다. 그것은 당신의 프로그램 디자인에 달려 있습니다.

‘스마트’복사 (또는 ‘딥’복사)를 수행하려면 복사를 수행하는 기능을 구현해야합니다. 구조체 자체에 포인터를 포함하는 포인터와 구조체가 포함되어 있고 이러한 구조체에 대한 포인터 ( “복잡한”이라는 의미)가 포함되어 있고 유지 관리하기 어려운 경우에는 달성하기가 매우 어려울 수 있습니다. 간단한 해결책은 C ++을 사용하고 각 구조 또는 클래스에 대해 복사 생성자와 할당 연산자를 구현 한 다음 각각 고유의 복사 의미를 담당하고 할당 구문을 사용할 수 있으며 더 쉽게 유지 관리하는 것입니다.


답변