1

我有一个函数,将int数组作为参数。该int数组表示一个字符串,但必须能够包含EOF,因此不能是 type 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*链接。在一般情况下这是很自然的,因为如果我现在尝试写一个大的 to ,它可能不适合 -只为 a 分配了内存(告诉我我是否错了)。int*intstr[some_index]str[some_index]char

但是因为我不会做任何这样的写,而只是比较(并且比较 char 和 int 应该没问题) - 我可以接受上述任何一个吗?在这种情况下如何摆脱编译警告?或者解决这个问题的最佳方法是什么?

我当然可以编写一个简单的函数来将char字符串文字给出的数组复制到一个int数组中,值对值,但必须有更好的方法。这样的解决方案也会浪费内存。

(顺便说一句 - 当使用 进行测试时EOF,我会做这样的事情:

int str[] = {'t', 'e', 's', 't', EOF};
fun(str);

应该可以正常工作。)

4

3 回答 3

5

您提出的演员阵容是一场灾难,除了编译器(有理由)抱怨它之外。

假设您使用的是 little-endian (Intel) 机器,该函数需要这样的内存布局(其中空白方块包含所有位为零):

+---+---+---+---+
| t |   |   |   |
+---+---+---+---+
| e |   |   |   |
+---+---+---+---+
| s |   |   |   |
+---+---+---+---+
| t |   |   |   |
+---+---+---+---+
|EOF|EOF|EOF|EOF|
+---+---+---+---+

您传递的是这样的内存布局:

+---+---+---+---+
| t | e | s | t |
+---+---+---+---+
| \0| 
+---+

这根本不是一回事。这完全忽略了可能的对齐问题;您正在传递 5 个字节的数据,没有 EOF 标记来标记字符串的结尾。

简而言之,不要这样做!

于 2012-12-30T00:54:25.200 回答
0

好的,总结一下:

隐含或显式强制转换(fun("test")以及fun( (int*) "test")相应地)不会做我想要的(有关详细信息,请参阅 Jonathan Lefflers 的回答)。

这里的方法可能是编写一些自定义函数,将字符串文字与一个EOF值结合起来,并将其全部作为int[].

于 2013-01-01T10:54:50.833 回答
-1

尝试与 0 进行比较,因为 EOF 是 0 的定义,而 char 等效项是 '\0'

于 2012-12-30T00:52:44.397 回答