developer tip

구조체를 C의 구조체로 복사

optionbox 2020. 12. 3. 07:46
반응형

구조체를 C의 구조체로 복사


동일한 구조체를 다른 구조체에 복사하고 나중에 첫 번째 구조체와 비교하여 사용하고 싶습니다. 문제는 내가 이렇게 할 때 내 컴파일러가 나에게 경고를 준다는 것입니다! 다른 방법으로해야합니까 아니면 잘못하고 있습니까?

헤더 파일에서 :

extern struct RTCclk
{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t mday;
uint8_t month;
uint8_t year;
}
RTCclk;

C 파일에서 :

struct RTCclk RTCclk;
struct RTCclk RTCclkBuffert;

void FunctionDO(void)
{
   ... // Some Code
   /* Copy first struct values into the second one */
   memcpy(&RTCclk, &RTCclkBuffert, sizeof RTCclk);
}

간단한 구조의 경우 사용하는 memcpy것처럼 사용 하거나 하나에서 다른 것으로 할당 할 수 있습니다 .

RTCclk = RTCclkBuffert;

컴파일러는 구조를 복사하는 코드를 생성합니다.


복사에 대한 중요한 참고 사항 : memcpy. 즉, 예를 들어 포인터를 포함하는 구조가있는 경우 복사 될 실제 포인터 일뿐 그들이 가리키는 것이 아니므로 복사 후에는 동일한 메모리를 가리키는 두 개의 포인터를 갖게됩니다.


귀하의 코드가 정확합니다. 하나를 다른 하나에 직접 할당 할 수도 있습니다 ( Joachim Pileborg의 답변 참조 ).

나중에 두 구조체를 비교할 때는 memcmp; 을 사용하는 대신 한 번에 한 멤버 씩 구조체를 비교해야합니다 . C에서 구조체를 어떻게 비교합니까?를 참조하십시오 .


c에서 구조를 복사하려면 다음과 같이 값을 할당하면됩니다.

struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;

RTCclk1.second=3;
RTCclk1.minute=4;
RTCclk1.hour=5;

RTCclkBuffert=RTCclk1;

이제 RTCclkBuffert.hour 값은 5가됩니다.

RTCclkBuffert.minute 값은 4입니다.

RTCclkBuffert.second의 값은 3입니다.


귀하의 memcpy코드가 정확합니다.

내 생각 엔 당신은 string.h의 포함이 부족합니다. 따라서 컴파일러는의 잘못된 프로토 타입을 가정 memcpy하므로 경고가 발생합니다.

어쨌든 단순성을 위해 구조체를 할당해야합니다 (Joachim Pileborg가 지적했듯이).


또한 좋은 예 .....

struct point{int x,y;};
typedef struct point point_t;
typedef struct
{
    struct point ne,se,sw,nw;
}rect_t;
rect_t temp;


int main()
{
//rotate
    RotateRect(&temp);
    return 0;
}

void RotateRect(rect_t *givenRect)
{
    point_t temp_point;
    /*Copy struct data from struct to struct within a struct*/
    temp_point = givenRect->sw;
    givenRect->sw = givenRect->se;
    givenRect->se = givenRect->ne;
    givenRect->ne = givenRect->nw;
    givenRect->nw = temp_point;
}

memcpy는 처음 두 인수가 void * 일 것으로 예상합니다.

시험: memcpy( (void*)&RTCclk, (void*)&RTCclkBuffert, sizeof(RTCclk) );

PS는 필요하지 않지만 관례에 따라 sizeof 연산자의 대괄호가 지정됩니다. C에서 코드를 유지 관리 할 수 ​​없게 만드는 많은 것을 피할 수 있으므로 다음 규칙을 따르는 것이 좋은 (고용 가능한) C 프로그래머의 표시입니다.


경고를 제거하려면 포인터를 (void *)로 캐스팅해야한다고 생각합니다.

memcpy((void *)&RTCclk, (void *)&RTCclkBuffert, sizeof RTCclk);

또한 대괄호없이 sizeof를 사용하면 변수와 함께 사용할 수 있지만 RTCclk가 배열로 정의 된 경우 sizeof of는 배열의 전체 크기를 반환합니다. sizeof with type을 사용하는 경우 대괄호와 함께 사용해야합니다.

sizeof(struct RTCclk)

참고 URL : https://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-c

반응형