将结构文字作为函数参数传递出来的麻烦

时间:2013-01-22 10:11:35

标签: c

请看一下这个程序

#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);
}

在主要的呼唤乐趣功能;当字符串文字(“dom”)被传递时,函数调用如何工作,当传递数组变量(dom)时它不起作用?

如果以特定的方式进行类型转换,那么可以进行变量工作吗?或者还有其他方式吗?

3 个答案:

答案 0 :(得分:4)

复合文字的存在令人分心,错误的原因是尝试用另一个char[]数组初始化char[]。以下是非法的:

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

和clang报告以下错误:

  

main.c:16:10:错误:数组初始值设定项必须是初始化列表或字符串文字

C99标准的 6.7.8初始化部分中的第14点:

  

字符类型数组可以由字符串文字初始化,可选地用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。

因此允许使用字符串文字"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 ^       ^ */
    

答案 1 :(得分:1)

在这种情况下,

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

你只是将指针传递给字符串。 换句话说,你只是传递

&"ine"[0]

答案 2 :(得分: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);
}