我有一个函数,以int
数组作为参数。int
数组表示一个字符串,但必须能够包含EOF
,因此不能是char[]
类型。我的函数看起来像这样:
_Bool fun(int str[]) {
// does something involving checking elements for EOF, e.g.:
return (str[0]==EOF);
}
出于测试目的,我想用字符串字面量调用fun
(尽管字符串字面量自然是char[]
类型,并且不能包含EOF
),实际上是:
fun("test");
可以编译,但是有错误参数类型的警告。这是预期的,因为字符串字面值是char[]
,参数是int[]
。
我可以这样做:
fun( (int*) "test");
可能是等价的,只是我显式地进行了强制转换,相同的编译警告。
我正在阅读将char*
转换为int*
不能保证工作(链接)。这在一般情况下是很自然的,因为如果我现在尝试写一个大的int
到str[some_index]
,它可能不适合- str[some_index]
只有分配给char
的内存(如果我错了请告诉我)。
但是因为我不会做任何这样的写,而只是比较(比较char和int应该是好的)-我对上面的任何一个都可以吗?在这种情况下如何消除编译警告?或者说解这个的最好方法是什么?
我当然可以写一个简单的函数来复制char
数组的字符串文字给到一个int
数组,值对值,但必须有一个更好的方法。这样的解决方案也会浪费内存。
(顺便说一下-当测试EOF
时,我会这样做:
int str[] = {'t', 'e', 's', 't', EOF};
fun(str);
你建议的强制转换是一场灾难,除了编译器(有理由)抱怨它。
假设您使用的是小端(Intel)机器,该函数期望的内存布局是这样的(其中空白方块包含所有位为零):
+---+---+---+---+
| t | | | |
+---+---+---+---+
| e | | | |
+---+---+---+---+
| s | | | |
+---+---+---+---+
| t | | | |
+---+---+---+---+
|EOF|EOF|EOF|EOF|
+---+---+---+---+
你传递的是一个像这样的内存布局:
+---+---+---+---+
| t | e | s | t |
+---+---+---+---+
| |
+---+
这完全不是一回事。这完全忽略了可能的对齐问题;你正在传递5个字节的数据,没有EOF标记来标记字符串的结束。
简洁地说,不要这样做!
OK, summary:
隐含或显式强制转换(分别为fun("test")
和fun( (int*) "test")
)将不做我想要的(详见Jonathan Lefflers的回答)。
这里的方法可能是编写一些自定义函数,将字符串字面值与EOF
值结合起来,并将其全部作为int[]
返回。
尝试与0进行比较,因为EOF是0的定义,而对应的字符是' '