c - 一个字符是否作为带有填充的整个单词保存在内存中?

标签 c arrays memory char

我在 C 语言中处理字符数组时遇到了一个奇怪的现象。 基本代码:

char buffer[2];
buffer[0] = 0x7F; /*until this value I get normal behaviour*/
buffer[1] = 0x80; /*from this value I get leading ones*/
printf("%X\n", buffer[0]);
printf("%X\n", buffer[1]);

这打印:

7F
FFFFFF80

只是为了确保我检查过

printf("%d\n", sizeof(char));
printf("%d\n", sizeof(int*));

正如预期的那样,我收到了:

1
4

所以在我的机器(32 位、x86、小端、Ubuntu 12.04.5 VM)上,一个字符是 1 个字节,一个字是 4 个字节。

当我将整个单词发送到 printf() 时,我得到 1 个填充。 我可以接受零填充,但这很奇怪......

  1. 有人有解释吗?

  2. char 数组不是真正的字符序列,而是我们只考虑第一个字节的单词序列吗? (言下之意,相同长度的char数组和int数组在内存中占用的空间大小相同)

最佳答案

printf 不知道每个参数有多大;你必须告诉它,在这种情况下使用 hh 长度说明符:

printf("%hhX\n", buffer[1]);

但是,您的情况下的行为仍然很明确,因为小于 int 的参数被提升为 intunsigned int一种必须等效于 0 填充或符号扩展的方式。

关于c - 一个字符是否作为带有填充的整个单词保存在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36746142/

相关文章:

c - 指针数组作为 C 函数中的参数

c - 为什么这个 C 代码给我一个总线错误?

arrays - 数组公式返回一个没有重复的数组,没有 VBA

c# - 如何在应用程序设置中存储 int[] 数组

android - 垃圾收集器如何释放 AsyncTask 分配的内存

c - 十进制到二进制转换器,控制台无响应

php - 变量没有 'stick' 到数组

java - Java 如何为新实例(带有 String 属性)分配内存?

c - 超出数组大小的元素值

c - 结构上的指针不能复制到函数内的另一个指针