2017-06-19 47 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); 
相關問題