2017-06-19 46 views
-2

我已经作为const char * server = NULL;c编程结构成员变量分配给一个char *

该变量被分配一个值的变量声明当用户通过的服务器的IP地址作为命令行参数到c程序使用下面的代码。例如运行./cprogram -h 10.4.0.01

opt = 1; 
    while (opt < argc) 
    { 
     if (argv[opt] == NULL 
      || argv[opt][0] != '-' 
      || argv[opt][2] != 0) 
     { 
      print_usage(); 
      return 0; 
     } 
     switch (argv[opt][1]) 
     { 

     case 'h': 
      opt++; 
      if (opt >= argc) 
      { 
       print_usage(); 
       return 0; 
      } 
      server = argv[opt]; 
      break; 
} 

我不再需要从程序传递命令行参数,并把该值在ini文件。

我现在在程序开始时读取一个ini文件并将值存储在一个结构中。

struct lwm2m_object { 
    char clientname[LG_BUF]; 
    char ipv4[LG_BUF]; 
    char server[LG_BUF]; 
}; 

在到该结构构件变量server分配给变量const char * server正确的方式使用该

server = &(lwm2m.server);

+3

这里有什么问题? – Curious

+0

您需要使用'strcpy'(或'strncpy')来分配结构中的C字符串。 –

+4

“C”和“C++”是不同的语言。你不应该一起使用标签(除非你的问题是关于''C''与''C++''的接口)。 – nefas

回答

1

分配是不正确的。正确的分配是

server = lwm2m.server; 
0

server = &(lwm2m.server); 

错上加错。首先,你打算复制的字符串是lwm2m.server--记住一个数组衰减到一个指针。因此,最好是

server = lwm2m.server; // still dangerous 

但是,这仅仅是拷贝的指针数据(浅拷贝)。如果lwm2m_objectlwm2m超出范围,则关联的字符串lwm2m_object::server被释放并且可以被重新使用。换句话说,你的副本server然后变成dangling pointer

如果您知道lwm2m生存server(所以没有得到一个悬摆指针的危险),那么浅拷贝是好的(和最好)。否则,您必须进行深层复制,使用strcpyn

const char server[LG_BUF]; 
strcpyn(server, lwm2m.server, LG_BUF); 
相关问题