请看一下这个程序
#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)时它不起作用?
如果以特定的方式进行类型转换,那么可以进行变量工作吗?或者还有其他方式吗?
答案 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);
}