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节C99 标准的初始化中的第 14 点指出:

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

因此,允许使用字符串文字进行调用,因为使用字符串文字"dom"初始化数组是合法的,但char[]不允许使用 调用。

可能的解决方案:

  • 将类型更改bufconst char*
  • 将成员包装buf在 astruct中,使其能够被复制。例如:

    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 回答