繁体   English   中英

C数组,我的记忆会发生什么

[英]C arrays, what will happen to my memory

读者,

任何人都可以向我解释当我运行这段错误代码时,计算机中会发生什么。 用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'

所以我想知道,数据[1]中的'1'会发生什么,并且我的记忆会发生什么?

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

data[1] = '10';

是:

  • int类型(在C中不是 char )的值'10'将被截断为char
  • 结果值将分配给data[1]

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

如果看到0 (在ASCII系统上通常为48),则意味着10被截断为0 ,这是存储的值。 然后, 1将完全丢失(可能不希望将其存储在阵列的相邻插槽中)。

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

  • data[]分配了5个元素
  • 定义了第一至第四元素
  • data[]的大小与5进行比较
  • 使用指向data[]开头的指针来调用Adjust()

我不理解您对读取data[1]的评论data[1] 它包含一些未定义的直到分配。

char x = '10'; 在大多数架构上与char x = '0'相同。 这是行为上与c ++的背离。 char表达式大多以整数形式处理,然后在存储时隐式类型转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM