为何在sizeof()中使用void*而非显式指针类型?C内存分配疑问
malloc(sizeof(type *))中使用显式指针类型是不良习惯? 在C编程里,这种写法被归为不良实践,核心问题集中在维护性、一致性和出错风险上,具体来说:
类型不一致的隐患
假设你写了这样的代码:int **ptr_array = malloc(10 * sizeof(int *));后续如果需要把
ptr_array的类型改成long **,很容易漏掉修改sizeof(int *)这部分,导致分配的内存大小不匹配——int *和long *在部分平台上长度可能不同,直接引发内存越界、崩溃等难以排查的bug。但如果写成:int **ptr_array = malloc(10 * sizeof(*ptr_array));不管变量类型怎么改,
sizeof(*ptr_array)都会自动匹配当前变量的元素类型,从根源避免了这类疏忽。冗余重复,增加维护成本
变量的类型已经在声明时明确过了,在sizeof里再次写类型名属于重复信息。代码中的重复内容越多,需要同步维护的地方就越多,出错概率也就越高。用sizeof(*变量)的方式,只需要在声明阶段确定类型,内存分配部分完全依赖变量本身,简洁又安全。“可读性”是伪需求
你觉得显式写类型能让读者快速知晓内存用途,但实际上变量声明已经清晰定义了类型:比如int **ptr_array一看就是用于存储int指针的指针数组,读者看一眼声明就能明白用途。反而sizeof(*ptr_array)更符合“关注点分离”——分配内存只需要关注当前变量的元素大小,不用重复冗余的类型信息。习惯这种写法后,可读性只会更高,因为不用再核对sizeof里的类型和变量类型是否一致。统一编码风格的价值
C社区推崇这种“类型无关”的内存分配方式,是因为它能形成统一的编码范式:不管是分配单个对象还是数组,不管是普通指针还是多级指针,都可以用malloc(n * sizeof(*ptr))的格式,不用根据类型调整写法。这种一致性能让团队成员快速理解代码,减少因写法混乱带来的沟通成本和错误。
内容的提问来源于stack exchange,提问作者Hobbes

