C语言中memset后用assert检查指针是否为0失败的问题
为什么
assert(ptr == 0)会失败?拆解你的内存操作误区 兄弟,你这段代码里犯了两个核心错误,直接导致断言触发失败,咱们一个个说清楚:
第一个错误:搞混了「指针变量」和「指针指向的内存」
你用malloc(100)拿到的ptr,本质是个存储内存地址的变量——它的值是堆上那100字节内存的起始地址(只要malloc成功,这个值肯定不是0)。而memset(ptr, 0, ...)做的事情是:把ptr指向的那块内存区域的字节清零,它完全不会改变ptr这个变量本身的值!
所以你后面用assert(ptr == 0),相当于在检查“这个指针变量存储的地址是不是0(NULL)”,但ptr从始至终都是malloc返回的那个非零地址,断言当然会炸。
第二个错误:sizeof(ptr)用错了
sizeof(ptr)计算的是指针类型的大小(32位系统是4字节,64位是8字节),但你明明malloc了100字节的内存,这里应该写100才对——不然你只清零了前4/8个字节,剩下的内存还是原始的垃圾值。
如果你的需求是确认malloc出来的内存被完全清零,可以这么修改代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <stdbool.h> // 辅助函数:检查一块内存是否全为0 bool is_memory_zero(const void* ptr, size_t size) { const unsigned char* p = (const unsigned char*)ptr; for (size_t i = 0; i < size; ++i) { if (p[i] != 0) { return false; } } return true; } int main() { void* ptr = malloc(100); // 先确保malloc成功,避免空指针操作 assert(ptr != NULL); // 正确清零全部100字节内存 memset(ptr, 0, 100); // 检查指针指向的内存是否全为0 assert(is_memory_zero(ptr, 100)); // 用完记得释放内存 free(ptr); return 0; }
如果你的本意其实是想把ptr变成NULL指针,那根本不需要memset,直接写ptr = NULL;就行——不过要注意,这样做会导致之前malloc的100字节内存没人释放,造成内存泄漏。
内容的提问来源于stack exchange,提问作者pavikirthi
相关产品推荐
相关产品推荐

