2016-05-24 3 views
-1

私は立ち往生しており、なぜこの機能コードが正しく動作しないのか分かりません。コードは、サーバーにデータを送信するircクライアントからのものです。なぜ関数ポインタがcharポインタポインタを受け取っていないのですか?

このコードは動作します:

void write_socket(char msg[512]) { 
    //////// Convert from unicode to encoding //////// 
    iconv_t cd = iconv_open(encoding, "UTF-8"); 
    char buffer[512]; 
    char *outptr = (char *) &buffer[0]; 
    size_t insize = 512; 
    size_t outsize = 512; 
    iconv(cd, &msg, &insize, &outptr, &outsize); 
    msg = buffer; 
    printf("(%lu) msg: %s\n", strlen(msg), msg); 
    int n = write(sockfd, msg, strlen(msg)); 
    if (n < 0) 
     error("Error writing to socket"); 
} 

私はwrite_socket("NICK kiyoshi\r\n");
を呼び出すときには、この出力できます:(14) msg: NICK kiyoshi
をしてサーバーに正常に接続します。

このコードは動作しません:

void write_socket(char *msg) { 
    encode(&msg, 512); 
    printf("encode: (%lu) msg: %s\n", strlen(msg), msg); 
    int n = write(sockfd, msg, strlen(msg)); 
    if (n < 0) 
     error("Error writing to socket"); 
} 

void encode(char **str, int size) { 
    if (*encoding) { 
     //////// Convert from unicode to encoding //////// 
     iconv_t cd = iconv_open(encoding, "UTF-8"); 
     char buffer[size]; 
     char *outptr = (char *) &buffer[0]; 
     size_t insize = size; 
     size_t outsize = size; 
     iconv(cd, &(*str), &insize, &outptr, &outsize); 
     *str = buffer; 
    } 
} 

私はwrite_socket("NICK kiyoshi\r\n");
呼び出すときには、この出力付与するものではありません:encode: (14) msg:
をし、決してサーバーに接続します。

charポインタの何が問題ですか?私は関数encodeを使用したいと思います。

+0

あなたが気づいていない場合、 'char * msg'はその文脈で' char msg [512] 'とまったく同じ意味です –

+0

@MMはい、' char msg [512] 'としていましたが、変換後に 'iconv_close(cd)'を呼び出す必要がありますか? – jackcogdill

+0

実際には、 'iconv'の戻り値をチェックしていません。 – t0mm13b

答えて

3

*strencode関数のローカルバッファに指定しているため、2番目のバージョンが失敗します。 staticと表示されていない限り、関数が戻るときにローカル変数は存在しなくなります。したがって、コードがint n = write(sockfd, msg, strlen(msg))になるときには、msgはぶら下がりポインタです。

write_socket関数でbufferを宣言し、バッファをencodeに渡すことです。機能エンコード

0

、可変バッファエンコード関数を呼び出しの終了後に、コンテンツがあまりにもなくなって、ローカル変数がスタックに格納され、ローカル変数です。

関連する問題