我可以检查指针是否由malloc/calloc/realloc分配?

SGM*_*GM1 13 c memory-management

我想知道是否可以检查传递给函数的指针是否由malloc/calloc/realloc分配?

int main(){
    struct something o;
    struct something *a;
    a = malloc(sizeof(struct something));
    freeSome(&o);/*This would normally throw an (corruption?) error*/
    freeSome(a);/*This is fine*/
}

void freeSome(struct something * t){
    if (/*expression here*/){
        free(t);
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白,通常你会检查是否t == NULL,但我只是想知道是否有可能看到是否已为给定指针分配内存.

Hal*_*oum 9

不,你不能.

基本上,你不应该这样做.如果你想要写一个辅助函数来释放给定的指针一些内存,应该比你awarely明确地动态分配的指针传递给内存某一区域这样做.

原始指针C不能传输关于它们指向的内存的额外信息.如果您想拥有此类信息,则必须传递一个包含您感兴趣的指针的附加包装器,例如:

typedef struct my_pointer
{
   void  *ptr;
   int   is_dynamically_allocated;
}  ptr;
Run Code Online (Sandbox Code Playgroud)

但这将是内存/时间的巨大损失.


kir*_*off 5

没有办法检查,您应该NULL初始化然后测试是否NULL确实

从第7.20.3.2节起C99标准的自由功能:

free函数使ptr指向的空间被释放,即可以用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果参数与calloc,malloc或realloc函数先前返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则该行为是不确定的。