在编写一些 C 代码时,我遇到了一个小问题,我必须将一个字符转换为“字符串”(一些内存块的开头由 char*
指针给出) .
想法是,如果设置了一些 sourcestr
指针(不是 NULL
),那么我应该将它用作我的“最终字符串”,否则我应该转换给定的charcode
插入另一个数组的第一个字符,并用它代替。
为了这个问题的目的,我们假设变量的类型不能事先改变。换句话说,我不能只将我的 charcode
存储为 const char*
而不是 int
。
因为我比较懒惰,我心想:“嘿,我不能只使用字符的地址并将该指针视为字符串吗?”。这是我写的一小段内容(不要用头撞墙!):
int charcode = FOO; /* Assume this is always valid ASCII. */
char* sourcestr = "BAR"; /* Case #1 */
char* sourcestr = NULL; /* Case #2 */
char* finalstr = sourcestr ? sourcestr : (char*)&charcode;
现在我当然试过了,正如我所料,它确实有效。即使有一些警告标志,编译器仍然很高兴。但是,我有一种奇怪的感觉,认为这实际上是未定义的行为,我不应该这样做。
我这样想的原因是因为 char*
数组需要以 null 结尾才能作为字符串正确打印(我希望我的也是这样!)。然而,我不确定 &charcode + 1
处的值是否为零,因此我可能会遇到一些缓冲区溢出问题。
它能正常工作是否有实际原因,或者我只是很幸运在尝试时在正确的位置得到了零?
(请注意,我不是在寻找其他方法来实现转换。我可以简单地使用 char tmp[2] = {0}
变量,并将我的角色放在索引 0。我也可以使用 sprintf
或 snprintf
之类的东西,前提是我对缓冲区溢出足够小心。有无数种方法可以做到这一点,我只是对此特定转换操作的行为感兴趣。)
编辑:我见过一些人称此为 hackery,让我们明确一点:我完全同意你的看法。我不是一个受虐狂,无法在已发布的代码中实际执行此操作。这只是我好奇 ;)
最佳答案
您的代码定义明确,因为您始终可以转换为 char*
。但有些问题:
请注意
"BAR"
是一个const char*
文字 - 所以不要试图修改内容。那将是未定义的。不要尝试使用
(char*)&charcode
作为 C 标准库中任何字符串函数的参数。它不会以空值终止。因此,从这个意义上说,您不能将其视为字符串。(char*)&charcode
上的指针算法将在标量charcode
之前有效并包括在内。但是不要尝试解引用任何超出charcode
本身的指针。表达式(char*)&charcode + n
有效的n
范围取决于sizeof(int)
。
关于c - 这个 (char*)&x cast 的行为定义明确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35577406/