在char a ='abc'时感到困惑;行为C编程

时间:2015-07-11 15:07:07

标签: c++ c memory-address

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

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 |
------------------------------------------------------------------------------

1 个答案:

答案 0 :(得分:5)

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

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 ++中。

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

  

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

但是char不是32位整数。它通常是一个8位整数。您发布的文字是关于类似

的内容
int32_t a = 'bcd';

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