2

读者,

任何人都可以向我解释当我运行这段错误代码时我的计算机会发生什么。使用 gnu gcc 编译器编译。在代码块中。

这是错误代码:

  char data[5];

  data[0] = '1';
  data[1] = '10';
  data[2] = '30';
  data[3] = '50';

  if(sizeof(data) == 5)
  {
  adjust(data);
  }

sizeof(data) 是 5,因为我声明了 char data[5]

如果我尝试读取数据 [1],我注意到它会返回最后一个字符。' 0''48'

所以我想知道,data[1] 中的“1”会发生什么,我的记忆会发生什么?

4

2 回答 2

3

您使用多字符文字有点令人困惑,例如10,这可能会增加您的困惑。像这样的行会发生什么:

data[1] = '10';

是:

  • int-type ( not char , in C) 值将'10'被截断为char
  • 结果值将分配给data[1]

确切地说,这是哪个值取决于编译器,因为文字大于单个char.

If you're seeing 0 (numerically 48 on ASCII systems), this means that 10 was truncated to 0, which is the value stored. The 1 was then completely lost (not stored in an adjacent slot of the array, which you might have expected).

于 2012-05-21T07:41:45.050 回答
1

除了 的影响之外adjust(),发生的事情非常清楚:

  • data[]分配有 5 个元素
  • 第一个到第四个元素被定义
  • 的大小data[]与 5 相比
  • 使用指向开头的指针调用adjust()data[]

我不明白你对阅读的评论data[1]。它包含一些未定义的内容,直到分配。

char x = '10';与大多数架构相同char x = '0'。这与 c++ 的行为有所不同。 char表达式主要作为整数处理,然后在存储时隐式类型转换。

于 2012-05-21T07:39:58.403 回答