2016-12-03 4 views
1

동적 문자열 구조체를 복사내가이 구조체가 버퍼 C

typedef struct 
{ 
    auth_header header; // another struct 
    uint8_t action; 
    uint8_t priv_lvl; 
    uint8_t authen_type; 
    uint8_t service; 
    uint8_t user_len; 
    uint8_t port_len; 
    uint8_t rem_addr_len; 
    uint8_t data_len; 
    char *user; 
    char *port; 
    char *rem_addr; 
    char *data; 

} auth_start; 

을하고 난 그래서 난 내 서버에이 데이터를 전송할 수있는 버퍼를 생성하고 그 안에있는 데이터를 삽입 할.

  1. 버퍼가 필요한 유형 (uint8_t/char/auth_start)이 확실하지 않습니다.
  2. 어떻게해야할지 모르겠다. 모든 필드를 1 by memcpy()로 복사해야합니까? 아니면 다른 방법이 있습니까?

감사합니다! :)

답변

1

내가

모든 바이트 타입이 어떤 작업을 수행 할 필요가 무엇 버퍼를 입력 모르겠어요. struct의 포인터가 아닌 필드 유형이 모두 uint8_t 인 경우를 고려하면 uint8_t을 선택하는 것이 좋습니다.

나는 내가 memcpy()

먼저 하나가 모든 분야 하나를 복사해야합니다, 나는 그것을 할 방법을 모르겠어요, 당신은 알아낼 필요가 얼마나 많은 메모리를 퍼 요구를. 그 메모리를 할당하고 지정되지 않은 포인터 부분을 할당과 함께 복사합니다. 마지막으로, 당신은 memcpy 데이터를 4 개의 포인터로 처리합니다 :

auth_start s = ... 
// Add 8 for the initial 8 members 
uint8_t *buf = malloc(8+s.user_len+s.port_len+s.rem_addr_len+s.data_len); 
uint8_t p = buf; 
// Copy the initial fields 
*p++ = s.action; 
*p++ = s.priv_lvl; 
... // And so on for the remaining members 
// Copy pointer-based members 
memcpy(p, s.user, s.user_len); 
p += s.user_len; 
memcpy(p, s.port, s.port_len); 
p += s.port_len; 
... // And so on for the remaining pointer members 
+0

감사합니다. 그리고 버퍼가 좋은지 어떻게 확인합니까? p를 auth의 시작으로 재설정하고 루프에서 인쇄해야합니까? – phantttom

+0

@phantttom 실제 포인터는 p가 아니라 buf입니다. 다음 struct를 처리하려면 p를 buf로 재설정하십시오. – dasblinkenlight

+0

귀하의 솔루션이 완벽하게 작동합니다. :) – phantttom