2017-06-19 14 views
-2

は、私は、ユーザーがCプログラムにコマンドライン引数としてサーバーのIPアドレスを通過するとき、この変数に値が代入されconst char * server = NULL;Cプログラミングchar *型に構造体のメンバ変数を割り当てる

として変数を宣言しました以下のコードを使用してください。 ./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ファイルを読み込み、値を構造体に格納しました。割り当てが正しくないこの

server = &(lwm2m.server);

+3

ここでの質問は何ですか? – Curious

+0

structにCの文字列を割り当てるには、 'strcpy'(または' strncpy')を使う必要があります。 –

+4

'' C''と '' C++ ''は異なる言語です。タグを一緒に使うべきではありません( '' C''と '' C++''とのインターフェースについての質問がない限り)。 – nefas

答えて

1

を用いた可変const char * serverに構造体のメンバ変数serverを割り当てる正しい方法で

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

。正しい割り当てが

server = lwm2m.server; 
0

あなた

server = &(lwm2m.server); 

二重に間違っです。まず、コピーしようとする文字列はlwm2m.serverです。配列がポインタに壊れることを覚えておいてください。だから、より良いデータへ

server = lwm2m.server; // still dangerous 

しかし、これだけでコピーポインタ(シャローコピー)です。 lwm2m_objectlwm2mが有効範囲外になると、関連する文字列lwm2m_object::serverが解放され、再利用される可能性があります。つまり、serverのコピーはdangling pointerになります。

あなたは(ダングリングポインタを得ることの危険がないように)serverlwm2mが生き残ることがわかっている場合には、浅いコピーは大丈夫(とが望ましい)です。それ以外の場合は、深いコピーを使用する必要があります。strcpyn

関連する問題