Указатель на структуру argv присваивания

Я пытался назначить argv[x] чтобы структура указывала на переменную. Я написал следующий код и получил ошибку сегментации, которая, как я знаю, является нарушением памяти. Я не понимаю, где я допустил ошибку. Вот код:

#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
typedef struct somestruct {
   char name[20];
   char surname[20];
   char misc[4056];
} somestruct;


int
main(int argc, char *argv[])
{
   somestruct *pvar;
   pvar = malloc(sizeof(somestruct));
   if (pvar==NULL)
      printf("malloc failed with: %s\n", strerror(errno));
   pvar = (somestruct *)  memset(pvar, 0, sizeof(somestruct));

   memcpy((char *) &(pvar->name), argv[1], 20);
   memcpy((char *) &(pvar->surname), argv[2], 20);
   memcpy((char *) &(pvar->misc), argv[3],4056);

   return 0;
} 

Заранее спасибо.

1 ответ

Решение

Исправьте ваш код, удалите & в memcpy:

   memcpy((char *) (pvar->name), argv[1], 20);
   memcpy((char *) (pvar->surname), argv[2], 20);
   memcpy((char *) (pvar->misc), argv[3],4056);

Кроме того, вы справляетесь с pvar от argv, синтаксис memccpy:

void *memcpy( void *to, const void *from, size_t count );  

куда count символы из массива from в массив to,

Так

  • третий аргумент в функции memcpy должен быть длиной argv[i] но не 20, 20, 4056,
  • Также добавьте ноль '\0',

Нравится:

   memcpy((char *) (pvar->name), argv[1], strlen(argv[1]));
   pvar->name[strlen(argv[1]) + 1] = '\0';
   memcpy((char *) (pvar->surname), argv[2], strlen(argv[2]));
   pvar->surname[strlen(argv[2]) + 1] = '\0';
   memcpy((char *) (pvar->misc), argv[3],strlen(argv[3]));
   pvar->misc[strlen(argv[3]) + 1] = '\0';
Другие вопросы по тегам