我常常发现自己正在做以下事情(在非关键组件中):
some_small_struct *ptr=(some_small_struct *) malloc(sizeof(some_small_struct));
ptr->some_member= ...;
Run Code Online (Sandbox Code Playgroud)
总之,我为一个小结构分配动态内存,我直接使用它而不检查malloc'ed指针.我知道程序总是有可能得不到它所要求的内存(呃!)但请考虑以下内容:
如果程序甚至无法从堆中的小结构获得一些内存,那么可能会出现更大的问题,而且它毕竟无关紧要.
那么,如果处理空指针会加剧岌岌可危的情况呢?(例如,尝试记录条件会调用更多不存在的资源等)
我的推理是否合理(足够)?
更新:
+X 访问可以隐藏NULL指针的根本原因我在接受采访时问了这个问题.
假设char*p = malloc(n)分配多于n,比如分配N个字节的内存,free(p)用于释放分配给p的内存.
堆管理器可以执行这样的错误分配吗?现在发生了什么,将释放n个字节或释放N个字节?
有什么方法可以找到释放多少内存?
编辑
有什么方法可以找到释放多少内存?
有总比没有好,
mallinfo()可以像"Fred Larson"所指出的那样轻松一些
我可能是愚蠢的,在这种情况下你需要原谅我...但我不明白这一点.我正在分配一个16个字符的缓冲区然后(在一个for循环中)放入23个(!?)随机字符,然后打印出那些东西.
我没有得到的是如何将23个字符放入一个malloc为16个字符的缓冲区...当我将循环更改为24个字符时,我得到一个错误(至少在Linux中使用gcc)... .但为什么不"更早"(17个字符应该打破它......不?)
这是我的示例代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
char *buf;
buf = malloc(16 * sizeof(*buf));
if(buf == NULL) exit(1);
for(n = 0; n < 22; n++)
{
buf[n] = rand()%26+'a';
}
buf[n]='\0';
printf("Random string: %s\n", buf);
free(buf);
buf = NULL;
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)