c - 这个 (char*)&x cast 的行为定义明确吗?

标签 c string casting character

在编写一些 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。我也可以使用 sprintfsnprintf 之类的东西,前提是我对缓冲区溢出足够小心。有无数种方法可以做到这一点,我只是对此特定转换操作的行为感兴趣。)

编辑:我见过一些人称此为 hackery,让我们明确一点:我完全同意你的看法。我不是一个受虐狂,无法在已发布的代码中实际执行此操作。这只是我好奇 ;)

最佳答案

您的代码定义明确,因为您始终可以转换为 char*。但有些问题:

  1. 请注意 "BAR" 是一个 const char* 文字 - 所以不要试图修改内容。那是未定义的。

  2. 不要尝试使用 (char*)&charcode 作为 C 标准库中任何字符串函数的参数。它不会以空值终止。因此,从这个意义上说,您不能将其视为字符串。

  3. (char*)&charcode 上的指针算法在标量 charcode 之前有效并包括在内。但是不要尝试解引用任何超出charcode 本身的指针。表达式 (char*)&charcode + n 有效的 n 范围取决于 sizeof(int)

关于c - 这个 (char*)&x cast 的行为定义明确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35577406/

相关文章:

c - C 中的 printf() 函数

c++ - 有没有办法有效地将 rapidjson 与 std::string 一起使用?

c++ - 如何将函数作为参数传递给transform()函数?

json - Swift 中的安全动态 JSON 转换

java - 列表对象的继承和转换

c - 替换裸机嵌入式系统中的启动文件

c - C 的 panel.h 中的面板堆叠顺序

c++ - 为什么 printf ("%f",0);给出未定义的行为?

arrays - 在数组中查找具有最多相同字母数的字符串对

c# - 在返回 float 的方法中将结果转换为 float 会改变结果