我一直认为:

  1. char由一个字节表示,
  2. 一个字节总是可以被计算为8位,
  3. sizeof (char)总是1
  4. 我能分配的最大理论内存量(以char秒计)是RAM的字节数(+交换空间).

但现在我已经读过Wikipedia entry on the byte了,我不再那么确定了.

我的哪一个假设是错误的?哪一个是危险的?

推荐答案

  1. 是的,charbyte差不多.字节是最小的可寻址内存量,C中的char也是如此.char的大小总是1.

    根据规范第3.6 byte节:

    byte

    可寻址的数据存储单元,其大小足以容纳执行环境中基本字符集的任何成员

    和第3.7.1 character条:

    character

    单字节字符

  2. charCHAR_BIT位.它可以是任何数字(根据规范,可以是8或更大),但大多数情况下肯定是8.不过,有些真正的机器有16位和32位的char种类型.CHAR_BIT定义在limits.h中.

    根据规范第5.2.4.2.1 Sizes of integer types 100节:

    下面给出的值应替换为适合在100预处理指令中使用的常量表达式.此外,除101102之外,以下内容应替换为与作为根据整数提升转换的相应类型的对象的表达式具有相同类型的表达式.其实施定义的值的大小(绝对值)应等于或大于所示的值,并带有相同的符号.

    — number of bits for smallest object that is not a bit-field (byte)
        CHAR_BIT                               8

  3. sizeof(char) == 1.永远.

    根据规范第6.5.3.4 The 100 operator节第3段:

    当应用于类型为100101102的操作数(或其限定版本)时,结果为1.

  4. 您可以分配系统允许分配的内存——标准中没有定义内存的大小.例如,你可以想象一台有云存储支持的内存分配系统的计算机——你的可分配内存实际上可能是无限的.

    以下是完整的规范第7.20.3.3 The 100 function节:

    Synopsis

    1 #include <stdlib.h>
       void *malloc(size_t size);

    Description

    2.100函数为大小由101指定且值不确定的对象分配空间.

    Returns

    3 100函数返回空指针或指向已分配空间的指针.

    这就是规范的全部内容,所以没有任何可以依赖的限制.

C++相关问答推荐

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

POSIX文件描述符位置

C:二进制搜索和二进制插入

当execvp在C函数中失败时杀死子进程

创建一个fork导致fget无限地重新读取文件

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

函数的限制限定指针参数允许优化调用方函数吗?

X64:并发写入布尔数组

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

按长度对argv中的单词进行排序

使用正则表达式获取字符串中标记的开始和结束

区分MySQL C界面中的文本和BLOB字段

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

memcmp 是否保证按顺序比较字节?

如何使用 VLA 语法使用 const 指针声明函数

C 语言中霍尔分区的快速排序算法

从管道读取数据时丢失

Clang 是否为内联汇编生成了错误的代码?