2

インターフェイスのMACアドレスを取得する次のコードがあります。

static struct ifreq get_mac( int socket_desc, char *if_name ) {                                                                                                                                                                         
      struct ifreq if_mac;                                                                                                                                                                                                                
      memset( &if_mac, 0, sizeof( struct ifreq ) );                                                                                                                                                                                       
      strncpy( if_mac.ifr_name, if_name, IFNAMSIZ - 1 );                                                                                                                                                                                  
      ...                                                                                                                                                                                                                                  
      return if_mac;                                                                                                                                                                                                                      
}

私のCの経験は、私が大学でしたことに限定されています。私は大まかにポインタを取得しますがstruct、スタックスペースが不足する可能性があるため(stackoverflow!)、値で大きなsを返すことは悪い考えであることを理解しています。上記のコードを変更して、代わりにポインタを返すにはどうすればよいif_macですか?struct演算子:Sの'アドレスと'があるため、少し混乱します。

4

3 に答える 3

3

パラメータで期待される構造へのポインタを指定します。

static int ifreq get_mac(int socket_desc, char *if_name, struct ifreq **if_mac)
{
      if (NULL == (*ifmac = malloc(sizeof (struct ifreq))) {
          return -1;                                        
      }                                                                                                                                                                                                                                                                                                                            
      memset(*if_mac, 0, sizeof(struct ifreq));                                                                                                                                                                                       
      strncpy((*if_mac)->ifr_name, if_name, IFNAMSIZ - 1);                                                                                                                                                                                  
      ...                                                                                                                                                                                                                                  
      return 0;                                                                                                                                                                                                                      
}

呼び出し元がすでに構造体にスペースを割り当てている場合、関数プロトタイプは次のようになります。

static int ifreq get_mac(int socket_desc, char *if_name, struct ifreq *if_mac)
于 2012-06-18T09:46:50.880 に答える
2

ポインタによる構造体をアウトパラメータとして取得することをお勧めします。これにより、動的メモリ管理(存在する場合)の決定と責任を呼び出し元に委ねることができます。

static void get_mac( int socket_desc, char *if_name, struct ifreq *if_mac ) { 
    ...
}

ただし、ほとんどのコンパイラは、とにかくパラメータ外呼び出しへの大きな構造体の戻りを最適化することを考えると、あまり意味がありません。構造体の大きさを知っていますif_macか?

于 2012-06-18T09:47:29.663 に答える
0

メモリ(malloc)を動的に割り当てif_mac てポインタを返すか、ポインタを関数自体に渡し、関数呼び出しの前にポインタを作成して変更を適用します。

2番目のケースでは何も返さないでください。それが役立つかもしれません。

于 2012-06-18T09:46:00.113 に答える