数组¶
数组¶
malloc¶
malloc 语法¶
- 这个对象没有对象类型
max_align_t(要考!)- fundamental alignment 是为了保证之后的转换满足别的类型的对齐要求
malloc 的返回值需要强制转换成有意义的对象类型
malloc(4)是后缀表达式 (函数调用),(int*)是 cast 表达式- 分配的对象的 alignment 是 fundamental alignment, 但是从
*p的视角看是 4 (因为是int) - 不要写
4, 而写sizeof(int)
malloc(sizeof(Obj_T) * N)¶
malloc 申请 N 个 Obj_T 大小的内存可以形式化定义为:
- 可以视为分配了一个
Obj_T[N]对象类型空间
int* p = (int*) malloc(sizeof(int)) 其实等价于:
- 蕴含着分配了一个
int[1]类型的空间
malloc 分配高维数组¶
- 把第一块
int[3]的首地址存到了ppArray[0]里 - 平时的
int[2][3]占据4*2*3=24个字节, 这里还要多消耗4*2=8个字节
思考题¶
(1) 利用 malloc 分配 240 个字节, 让该 240 字节类型视为 int[6][10]
(2)
假设 p 的值是 Add , s+1 的值是多少?
s的 Obj_T 是int (*)[4],sizeof(*s) = 4*4 = 16, 所以是Add + 16
指针?¶
<address, pointer type> 这个 <rvalue, rvalue type> 就是指针. 也就是说, pointer 是表达式 evaluate 后得到的
const 限定符¶
const 限定数组类型时, 限定的是其元素类型
字符串不是常量!¶
"hello" 是不可修改的 lvalue, 对象七元组: <char[6], char*, addr>
"hello"[0] 是可修改 lvalue, 对象七元组: <char, char, 'h'> , 可以修改, 但是是 UB









