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

我想知道是否可以检查传递给函数的指针是否由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); } } 

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

不,你不能。

基本上,你不应该这样做。 如果你想编写一个辅助函数来释放给定指针的内存,那么你应该明确地并且明确地将动态分配的指针传递给某个特定的内存区域来执行此操作。

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

 typedef struct my_pointer { void *ptr; int is_dynamically_allocated; } ptr; 

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

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

从第7.20.3.2节开始,C99标准的自由function:

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