You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:53:29