我有一个函数,将一个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*
不能保证有效 ( link )。这在一般情况下很自然,因为如果我现在尝试将一个大的 int
写入 str[some_index]
,它可能不适合 - str[some_index]
只为 char
分配了内存(如果我错了请告诉我)。
但是因为我不会做任何这样的写,而只是比较(并且比较 char 和 int 应该没问题) - 我可以接受以上任何一个吗?在那种情况下如何摆脱编译警告?或者什么是解决此问题的最佳方法?
我当然可以编写一个简单的函数来将字符串文字给出的 char
数组复制到 int
数组中,一个值一个值,但是必须有更好的方法.这样的解决方案也会浪费内存。
(顺便说一句 - 当使用 EOF
进行测试时,我会做这样的事情:
int str[] = {'t', 'e', 's', 't', EOF};
fun(str);
应该可以正常工作。)
最佳答案
你提议的转换是一场灾难,除了编译器(有理由地)提示它之外。
假设您使用的是小端 (Intel) 机器,该函数需要这样的内存布局(其中空白方 block 包含所有位为零):
+---+---+---+---+
| t | | | |
+---+---+---+---+
| e | | | |
+---+---+---+---+
| s | | | |
+---+---+---+---+
| t | | | |
+---+---+---+---+
|EOF|EOF|EOF|EOF|
+---+---+---+---+
你传递的是这样的内存布局:
+---+---+---+---+
| t | e | s | t |
+---+---+---+---+
| \0|
+---+
这根本不是一回事。这完全忽略了可能的对齐问题;您正在传递 5 个字节的数据,没有 EOF 标记来标记字符串的结尾。
简而言之,不要这样做!
关于C: 字符串文字到 int 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087304/