Cppcheck报‘size非底层类型大小的整数倍’,代码正常运行是否有问题?
关于Cppcheck警告“分配的大小12不是底层类型大小的整数倍”的疑问
我的C程序中有一行代码:
double** out = malloc(3 * sizeof(double*));程序可正常运行,但编辑器中的Cppcheck报告错误:‘分配的大小12不是底层类型大小的整数倍’。请问该错误是什么意思?是否真的存在潜在问题?
编辑于2018-05-02:Cppcheck更新后该警告已消失。
问题解析与解答
首先咱们拆解这个警告的来龙去脉:
- 你写的代码是要分配一个能容纳3个
double*类型指针的数组空间。在32位系统中,sizeof(double*)是4字节,3*4=12字节。旧版本的Cppcheck在这里出现了检测逻辑误判——它错误地把double的大小(通常是8字节)当成了需要对齐的“底层类型”,12不是8的整数倍,所以抛出了这个警告。 - 但实际上你的代码写法是完全标准且安全的:用
N * sizeof(指针类型)来分配指针数组的空间,是C语言中动态分配多维数组/指针数组的常规操作,这个计算方式能适配不同系统下的指针大小(比如64位系统中double*是8字节,3*8=24字节,这时候就不会触发这个误报)。
是否存在潜在问题?
完全没有!你的代码逻辑是正确的,程序能正常运行也验证了这一点。这个警告纯粹是旧版本Cppcheck的检测bug,你后续提到更新Cppcheck后警告消失,也印证了这一点——新版本修复了这个误判的逻辑,不再会把指针数组的分配空间和指向类型的大小绑定在一起进行错误的对齐检查。
内容的提问来源于stack exchange,提问作者Stéphane Laurent
相关产品推荐
相关产品推荐

