C: 字符串文字到 int 数组

标签 c arrays string string-literals

我有一个函数,将一个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/

相关文章:

C:查找整数的 n 次方底数(使用函数)

c - 我想将两个模块合二为一。第一个是方程;第二个取该方程的积分

java - Netty 大字符串,没有足够的可读字节

c - 指定 C 库的包含目录

c - ncurse 窗口中的 printw 加 scanf 将不会显示键入的文本

在 mpir 中创建大型数组

javascript - 当 "TypeError: array.splice is not a function"时如何解决 'var array = {}'?

python - 用户选择的变量从列表中删除

java - 在 Java 中分割正则表达式并捕获匹配的分隔符表达式?

c# - 属性或索引器不能分配给 "--"它是只读的