7

ぜひこの番組をご覧ください

#include<stdio.h>
#include<string.h>

typedef struct hs_ims_msrp_authority
{
   int     host_type;
   char    buf[50];
   int     port;
}hs_i;

int main()
{
 char dom[50];
 int i = 10, j = 20;
 strcpy(dom, "ine");
 fun((hs_i){i, dom, j});   // doesnt work
 fun((hs_i){i, "dom", j}); // this works
}

int fun(hs_i c)
{
 printf("%d %s %d\n", c.host_type, c.buf, c.port);
}

main の fun 関数の呼び出し中。文字列リテラル ("dom") が渡されたときに関数呼び出しが機能するのに、配列変数 (dom) が渡されたときに機能しないのはなぜですか?

変数を機能させるには、特定の方法で型キャストする必要がありますか? または他の方法はありますか?

4

3 に答える 3

5

複合リテラルの存在は気を散らしており、エラーの原因はchar[]別のchar[]配列で a を初期化しようとしたことです。以下は違法です。

char dom[50] = "test";
char dom1[50] = dom;  /* Line 16, the cause of the error. */

そしてclangは次のエラーを報告します:

main.c:16:10: エラー: 配列初期化子は、初期化子リストまたは文字列リテラルでなければなりません

セクション6.7.8のポイント 14 C99 標準状態の初期化:

文字型の配列は、文字列リテラルで初期化することができ、オプションで中括弧で囲みます。文字列リテラルの連続する文字 (空きがある場合、または配列のサイズが不明な場合は、終端の null 文字を含む) は、配列の要素を初期化します。

したがって、文字列リテラル"dom"を使用して配列を初期化することは合法であるため、文字列リテラルを使用した呼び出しは許可されますが、 を使用した呼び出しは許可されてchar[]いません。

可能な解決策:

  • のタイプを に変更bufしますconst char*
  • bufメンバーを でラップして、structコピーできるようにします。例えば:

    struct char_array
    {
        char data[50];
    };
    
    typedef struct hs_ims_msrp_authority
    {
        int     host_type;
        struct char_array buf;
        int     port;
    } hs_i;
    
    struct char_array dom = { "ine" };
    int i = 10, j = 20;
    
    fun((hs_i){i, dom, j});
    fun((hs_i){i, { "dom" }, j});
          /* Note ^       ^ */
    
于 2013-01-22T10:25:24.263 に答える
1

この場合、

fun((hs_i){i, dom, j});

文字列へのポインタを渡すだけです。言い換えれば、あなたはただ通過している

&"ine"[0]

于 2013-01-22T10:17:02.220 に答える
0

まず、関数を前方宣言する必要があります。

 fun(hs_i c)

次に、構造体用のストレージを作成する必要があるため、ある種の一時変数が必要になります。

 hs_i temp = { i, NULL, j };
 strcpy(temp.buf, "ine")
 fun(temp); 

または、個々の変数として関数に渡します。

 fun(int host_type, char *buf, int port);

....
 fun(10, "ine", 20); 

.....

int fun(int host_type, char *buf, int port)
{
 printf("%d %s %d\n", host_type, buf, port);
}
于 2013-01-22T10:19:55.667 に答える