malloc、calloc 和 realloc 的失败语义与所有权怎样处理?
malloc 分配未初始化存储,calloc 按元素计数并置零但仍要防乘法溢出;realloc 可能原地扩展、搬迁或失败,失败时原指针仍有效。应用应先接收临时返回值,再更新所有权。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
malloc 分配未初始化存储,calloc 按元素计数并置零但仍要防乘法溢出;realloc 可能原地扩展、搬迁或失败,失败时原指针仍有效。应用应先接收临时返回值,再更新所有权。
restrict 是特定执行期间对对象访问路径的别名承诺,可帮助向量化和消除重复加载。若调用者传入重叠对象却违反承诺,行为未定义;它不是运行时检查,也不等于 const。
sizeof 数组对象得到整个数组字节数,strlen 沿字符序列查找到首个 `\0`,不包含终止符;数组作为大多数表达式或函数参数时会转换为首元素指针,此时 sizeof 得到指针大小。
strcpy 不知道目标容量;strncpy 在源过长时不保证终止且会填充剩余空间;snprintf 接收容量并返回所需长度,更适合格式化,但仍要检查截断和返回错误。接口最好同时携带指针与容量。
strtok 会修改输入字符串并通过内部状态记住下一位置,多线程、嵌套解析或中断重入会互相覆盖状态。可使用 strtok_r、显式游标解析,或对不允许修改的数据使用长度切片。
#define 在预处理阶段做 Token 替换,没有类型语义;typedef 在编译阶段为已有类型定义别名,遵守作用域和声明语法。尤其声明多个指针或叠加 const 时,两者展开结果可能完全不同。
unique_ptr 表达唯一所有权并可移动;shared_ptr 通过控制块共享寿命;weak_ptr 不增加强引用,可观察 shared_ptr 对象并打破引用环。嵌入式项目还要评估控制块分配、原子计数和析构发生上下文。