2013-02-28 144 views
1

我一直试图将argv[x]赋值给变量指向的结构。 我写了下面的代码,并得到分段错误,我知道这是内存违规。我不明白我犯了什么错误。 下面是代码:指向结构argv赋值的指针

#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; 
} 

预先感谢您。

回答

5

更正你的代码中,memcpy的删除&

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

此外,您是从argv应对到pvar。 memccpy的语法是:

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

当从阵列from到阵列tocount字符。

所以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'; 
+1

谢谢Grijesh。 – 2013-02-28 09:22:57

+0

@DaniloMitrovic欢迎Danilo – 2013-02-28 09:26:00