【问题标题】:What happens when I assign a string to a char?当我将字符串分配给 char 时会发生什么?
【发布时间】:2017-10-04 16:07:34
【问题描述】:

我写道:

char ch = "ABC";

现在,当我编译它时,我没有收到任何错误。但是,如果我尝试单独显示这些字符或一次显示整个字符串,我将无法这样做,因为每当我尝试这样做时,我的程序都会崩溃。

这个程序发生了什么?

【问题讨论】:

  • 你使用什么编译器?你的平台是什么?
  • 这在任何编译器中至少应该是一个警告。你用的是什么标志?你在程序崩溃时得到什么输出?
  • 如果您知道代码错误,请不要担心编译器在做什么,只需修复代码!并打开警告
  • char ch = *"ABC"; printf("%c\n", ch);char ch[] = "ABC"; printf("%s\n", ch); BTW 尝试将字符串分配给一个字符是什么意思?
  • 坏事发生了。没有你会感兴趣的现实生活场景。

标签: c arrays char


【解决方案1】:

通常应该发生的事情(至少对于相当现代的编译器)是您收到一条错误消息,因为所涉及的转换不应该在没有显式转换的情况下发生。

但是,让我们考虑一下当/如果我们确实强制编译器执行肮脏的行为时会发生什么,可以这么说。让我们考虑一个包含强制转换的强制转换的程序并且做了一些其他的事情,这将使真正发生的事情更加清晰(我认为)。

#include <stdio.h>

int main() {
    char const *s = "ABC";

    int i = (int)s;
    unsigned char c = (unsigned char)s; 

    printf("%p\n%8x\n%8x\n", s, i, c);
}

(我使用unsigned char 而不是char 只是为了防止在恰好设置了指针的第7 位时对值进行符号扩展)。

我从中得到的输出如下所示:

0x4005f4
  4005f4
      f4

所以这里发生的事情是 "ABC" 是一个字符串文字,我们可以使用它来初始化(以及其他可能性)指向 (const) char 的指针。如果我们将其转换为指向 void 的指针,我们可以看到存储该字符串文字的地址(注意:如果您编译它,您得到的地址可能会有所不同)。

如果我们将该地址转换为无符号整数,我们会得到相同的值。标准并不能保证这一点,但在大多数典型情况下,这几乎是您可能会看到的。

最后,我们将指针转换为char。以十六进制打印出来,我们可以很容易地看到它只是保留了地址的 8 个最低有效位。同样,标准不能保证它恰好是 8 位,但对于 char 来说,它是一个非常典型的大小。

免责声明:尽管您可能会看到与我展示的结果相似的结果,但几乎所有这些都不能保证。支持打印出指向 void 的指针,但将使用的确切格式取决于编译器/库。同样,转换为整数类型的结果也不能完全保证——但在大多数典型的计算机/编译器实现中,您可以期望看到类似于我上面显示的结果。

底线:分配给char 的值通常是分配用于存储字符串文字的地址的最低有效 8 位(这实际上是无用的)。

【讨论】:

    猜你喜欢
    • 2014-08-02
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多