1

我一直在尝试分配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;
} 

先感谢您。

4

1 回答 1

5

更正您的代码,&在 memcpy 中删除:

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

此外,您正在应对pvarargv. memccpy 的语法是:

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

其中count字符从数组from到数组to

所以

  • memcpy 函数中的第三个参数应该是长度,argv[i] 但不是20、20、4056,
  • 还要添加 null '\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';
于 2013-02-28T08:51:30.623 回答