c++ - 对 char a ='abc' 感到困惑;行为C编程

标签 c++ c memory-address

enter image description here 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 |
------------------------------------------------------------------------------

最佳答案

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

一个char包含一个单个字符,它总是一个字节长。编写 char a 可以让您使用一个字节。您无法通过a访问该之前和之后的字节。如果编译器不想的话,它也不需要在 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++ 中。

<小时/>

好的,您的编辑使您所谈论的内容更加清晰。引用您发布的内容:

4 ASCII characters can fit in a 32 bit integer

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

int32_t a = 'bcd';

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

关于c++ - 对 char a ='abc' 感到困惑;行为C编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31358541/

相关文章:

c++ - C++中错误的计算方法

c++ - 在 C++ 中使用模板类型不匹配

c++ - 为什么我们在重载赋值运算符时必须清空当前 vector ? C++

c - 贪吃蛇 2 名玩家 - 多线程不起作用

c - sizeof(*v) 在 C 中意味着什么?

python - 在python中访问内存地址

c++ - 升级到 TensorRT 7 后加载或构建 cuda 引擎偶尔会崩溃

c - 如何忽略自己广播的udp包

c - 用 C 指针置换

c - &"string"与 "string"是同一地址吗?