【问题标题】:Confused at char a='abc'; behavior C programming [duplicate]对 char a='abc' 感到困惑;行为C编程[重复]
【发布时间】:2015-07-11 15:07:07
【问题描述】:

32 位系统中的字大小为 4 字节。 所以 char a='bcd';已验证。一个 32 位整数可以容纳 4 个 ASCII 字符。

char a='bcd';
//output is d for this line
printf("%c\n",a); 

//output is 'z' when i use *(&a-1) and '�'(is -67 when manipulated)
printf("%c\n",*(&a-1)); 

现在我只想知道&a-1 (this is not 'b') 会指向什么?它是最后的内存地址吗? 还有一件事是将字符打包到int 中的顺序是什么。

------------------------------------------------------------------------------
| bits  : _ _ _ _ _ _ _ 8 _ _ _ _ _ _ _ 16 _ _ _ _ _ _ _ 24 _ _ _ _ _ _ _ 32 |
| order : ? ? ? ? ? ? ? 8 ? ? ? ? ? ? ? 16 ? ? ? ? ? ? ? 24 ? ? ? ? ? ? ? 32 |
------------------------------------------------------------------------------

【问题讨论】:

  • 'bcd' 不是有效的单个 char 文字。可能您对字符串文字之类的东西感到困惑:"bcd"
  • 你不能这样做char a = 'bcd'
  • 是什么让您认为char 的大小与32bit integer 一样大?
  • @user007 实现已定义!=未定义。关于*(&a - 1),你认为它有什么作用? a 是一个单独的字符,不管它是否有一些 impl.defined 值,它只是一个 char。之前的内存地址不属于这个char
  • @deviantfan 不要误会亲爱的,那不是给你的,那是给所有其他不赞成我并给我上一课的人的:P 不要介意 yaar....我是新的蜜蜂C 语言的世界。我正在使用 gcc 。

标签: c++ c memory-address


【解决方案1】:

“所以 char a='bcd'; 是有效的。” 不,它不是,至少不是你所期望的(是的,'bcd' 是一个多字节字符常量,但是not 确实像您期望的那样存储多个字符,而是一些实现定义的数字)。

char 包含一个单个 字符,它总是一个字节长。写char a 会给你一个字节来玩。您不能通过a 访问之前和之后的字节。如果编译器不想这样做,not 也需要在您的 char 周围添加任何填充。由于文字 'bcd' 具有(至少在我的系统上)一个不适合 char 的值(在我的系统上是 6447972),因此您最终会得到一个具有实现定义值的单字节 char。即使a 周围有填充字节,您也不能假设它们已被写入。

printf("%c\n",*(&a-1));

调用未定义的行为,因为您不拥有该内存。这与任何类型的“字长”无关。

如果要存储字符序列,请使用

const char *str = "Some text";

(或

char str[] = "Some text";

如果你想修改序列)在 C 或

std::string str = "Some text";

在 C++ 中。


好的,您的编辑更清楚地说明了您在说什么。引用您发布的内容:

32 位整数可以容纳 4 个 ASCII 字符

char 不是 32 位整数。它通常是一个 8 位整数。您发布的文字是在谈论类似

int32_t a = 'bcd';

(或者可能是uint32_t a)。现在a实际上是32位长,可以保存32位信息。但是正如您引用的文本已经说过的那样,这很少有用,因为这种分配的结果完全取决于实现。

【讨论】:

  • 它是 C 中有效的多字节字符常量。实际行为是实现定义。以下answer 解释了在 C++ 中也是如此。
  • 是的@GrzegorzSzpetkowski 这就是我想说的link
  • @SandeepSinghRana 但是你知道你链接的帖子没有使用char(而是一个真正的4字节int)? (而且它仍然是定义的实现)
猜你喜欢
  • 2021-12-15
  • 2015-02-27
  • 2021-01-27
  • 2013-10-21
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多