我只是在c语言上试验一下 你能否回答我关于我写的程序的问题
void main()
{
char *p,; // created a pointer pointing to string
p = (char *) malloc(50); // dynamically create 50 bytes.
strcpy(p, "this code is written about the dynamic allocation");
p += 20;
free(p);
}
现在有人能告诉我free(p)语句的效果是什么,将释放最后30个字节并用于将来的内存分配。什么是输出?
答案 0 :(得分:10)
除malloc()
,calloc()
或realloc()
返回的地址外,您不应该释放任何地址。 p + 20
没有这样的地址。
http://codepad.org/FMr3dvnq向您显示此类free()
可能会失败。
free()函数释放ptr指向的内存空间,必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生undefined behavior。如果ptr为NULL,则不执行任何操作。
即使你可以在任何指向malloc内存的指针上使用free()
- 你可以将它释放两次,因为你在free()
以上调用了该区域内的一个记忆。双重释放是邪恶的,因为它们可能导致安全漏洞。
答案 1 :(得分:2)
这将导致未定义的行为。
free()
函数将导致ptr指向的空间被释放;也就是说,可供进一步分配。如果ptr是空指针,则不会发生任何操作。否则,如果参数与先前由calloc()
,malloc()
,posix_memalign()
,realloc()
,strdup()
函数返回的指针不匹配,或者通过调用free()
或realloc()
取消分配空间,行为未定义。