c - 我们是否总是需要在 malloc/realloc 之后检查指针是否为空?

标签 c pointers malloc realloc

我现在正在学习 C,在一些代码示例中,我看到在为指针分配一些内存后,我们必须检查指针是否为 NULL。例如:

CVector *vector = malloc(sizeof(struct CVectorImplementation));
assert(vector != NULL);

另一个例子:

vector->elements = realloc(vector->elements, vector->elemsz * vector->vec_capacity);
assert(vector->elements != NULL);

不过,我想既然指针已经被分配了,那么它的值就是分配内存的地址,所以它总是必要的吗?为什么?

最佳答案

如果您已重新分配原始指针以响应 realloc,则为响应失败而做任何有用的事情都为时已晚。当 realloc 失败时,它返回 NULL,但它不会释放原始指针。因此,即使您对分配失败(不常见)有一些合理的响应,您也已经泄漏了您尝试realloc 的内存。

您的主要问题的答案主要是“允许 NULL 指针取消引用发生是个坏主意,因为它是漏洞的来源”;通常漏洞会出现在内核代码中(其中 NULL 与其他任何地方一样是有效的地址),但即使它不可利用,也意味着程序会出现段错误而不是以有用的方式报告错误.

关于c - 我们是否总是需要在 malloc/realloc 之后检查指针是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33227879/

相关文章:

c - 在函数之间传递结构

有人能解释一下C语言中的for循环吗? for(x = i = 0; i <= 100; i += 2, x += i);

c - 如何使用 scanf() 从输入中读取直到找到换行符?

C++在范围结束后丢失指针引用

c - 传递给函数的指针不重新分配

c++ - gcc 源代码中的 C++ new() 函数在哪里?

c - 为什么 Linux 不能防止产生无限数量的进程和崩溃?

c - 您在增长缓冲区上使用什么 var 类型

c - 堆分配一个二维数组(不是指针数组)

c - 错误: incompatible types when assigning to type ‘struct card’ from type struct card *’