据我所知,每一种类型--比如int--只能存储在以2的幂开始的内存地址中.现在我的问题是,Malloc如何满足这种要求?例如,如果我调用

void * ptr;
ptr = malloc(8);

那么我想要在给定的8字节的内存块中存储什么就不明显了.因此,是否Malloc总是返回块的起始地址,该地址位于2的最大幂,从而可以存储所有标准类型?如果我误解了什么,请随时纠正我.

推荐答案

C 2018 7.22.3规定了内存分配 routine 的行为,它的第1段说"…如果分配成功,则返回的指针被适当地对齐,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针…"

6.2.8 2表示:

…下列类型的对中要求应为基本对中:

  • 所有原子、限定或非限定的基本类型;

  • 所有原子、限定或非限定枚举类型;

  • 所有原子、限定或非限定指针类型;

  • 元素类型具有基本对齐要求的所有数组类型;

  • 第7条中规定的作为完整对象类型的所有类型;

  • 所有 struct 或联合类型,其所有元素的类型都具有基本对齐要求,并且其元素都没有指定不是基本对齐的对齐的对齐说明符.

6.2.5 14表示:

类型char、有符号和无符号整数类型以及浮点类型统称为basic types.

C++相关问答推荐

rSP堆栈指针在返回函数调用的值时有任何用途吗?

GCC不警告隐式指针到整数转换'

为什么可以通过指向常量int的指针间接地改变整数的值?

增加getaddrinfo返回的IP地址数量

将常量转换为指针会增加.数据大小增加1000字节

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

在我的代码中,我需要在哪里编写输出函数?

使用错误的命令执行程序

I2C外设在单次交易后出现故障

覆盖读取函数,但当文件描述符为3或4时,我有问题

错误...的多个定义(&Q)首先在这里定义&

C语言中神秘的(我认为)缓冲区溢出

不确定如何处理此编译错误

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

C中的空指针是什么(_N)?

Matlab/Octave对conv2函数使用哪种方法?

System V 消息队列由于某种原因定期重置

使用共享变量同步多线程 C 中的函数

clion.我无法理解 Clion 中发生的 scanf 错误

nullptr_t 是否会 destruct 类型双关或指针转换?