использование memcpy () - PullRequest
2 голосов
/ 28 июля 2011

Уже два дня я играю с C и постоянно сталкиваюсь с новой проблемой. Сейчас я хочу сделать memcopy моих данных в char buf, но у меня возникли некоторые проблемы: мой код ниже:

         int main(int argc, char *argv[])
        {
         int sockfd, portno, n;
         struct sockaddr_in serv_addr;
         struct hostent *server;
     unsigned char buf[1024];

        struct profile_t 
      {
        unsigned char length;
        unsigned char type;
        unsigned char *data;
      };

        typedef struct profile_datagram_t
      {
        unsigned char src[4];
        unsigned char dst[4];
        unsigned char ver;
        unsigned char n;
        struct profile_t profiles[MAXPROFILES];     
      } header;


      header outObj;

      outObj.src[0] =1;
  outObj.dst[0] = 2;
  outObj.ver = 1;
  outObj.n = 2;


  outObj.profiles[0].length = 10;
  outObj.profiles[0].type = 1;
  outObj.profiles[1].length = 10;
  outObj.profiles[1].type = 2;




  memcpy(buf,outObj.src,4);
  memcpy(buf+4,outObj.dst,4);
  memcpy(buf+8,outObj.ver,1);
  memcpy(buf+9,outObj.n,2);


  memcpy(buf+10,outObj.profiles[0].length,1);
  memcpy(buf+11,outObj.profiles[0].type,1);
  memcpy(buf=12,outObj.profiles[0].data,10);

Я получаю следующие ошибки:

предупреждение: передача аргумента 2 из memcpy делает указатель из целого числа без приведения
ошибка: несовместимые типы при назначении типу unsigned char[1024] из типа int

Ошибки относятся к memcpy(). Может кто-нибудь объяснить мне о memcpy(), а также о том, где я иду не так.

Ответы [ 3 ]

6 голосов
/ 28 июля 2011

Вам необходимо передать адрес различных полей ваших структур.Когда вы передаете массив по имени, это автоматически является адресом начала массива.Но для полей, не являющихся массивами, требуется оператор адреса &:

memcpy(buf+10,&outObj.profiles[0].length,1);

В качестве отступления лучше использовать тип length:

memcpy(buf+10,&outObj.profiles[0].length,sizeof(outObj.profiles[0].length));
1 голос
/ 28 июля 2011

Я затрону две основные проблемы:

  • Вам нужно будет использовать адрес элементов без указателей в таких структурах, как ver или n:

    /* note the & before outObj.ver */
    memcpy(buf+8, &outObj.ver, 1);
    
  • Вы случайно присвоили значение buf в последней строке:

    memcpy(buf=12,... /* should be buf+12 */
    
0 голосов
/ 28 июля 2011

В качестве подсказки, если вы уверены в отношении структуры памяти и порядка байтов вашего buf, и структуры (включая ее заполнение и выравнивание), вы можете просто выполнить приведение типа:

header * outObj = (header *)buf;

И автоматически получать доступ к членам.Как header->ver, header->src и т. Д.

...