C中的动态内存分配

时间:2011-06-16 06:13:43

标签: c pointers free

我只是在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个字节并用于将来的内存分配。什么是输出?

2 个答案:

答案 0 :(得分:10)

malloc()calloc()realloc()返回的地址外,您不应该释放任何地址。 p + 20没有这样的地址。 http://codepad.org/FMr3dvnq向您显示此类free()可能会失败。

  

free()函数释放ptr指向的内存空间,必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生undefined behavior。如果ptr为NULL,则不执行任何操作。

Does the pointer passed to free() have to point to beginning of the memory block, or can it point to the interior?也值得一读。

即使你可以在任何指向malloc内存的指针上使用free() - 你可以将它释放两次,因为你在free()以上调用了该区域内的一个记忆。双重释放是邪恶的,因为它们可能导致安全漏洞。

答案 1 :(得分:2)

这将导致未定义的行为。

free()函数将导致ptr指向的空间被释放;也就是说,可供进一步分配。如果ptr是空指针,则不会发生任何操作。否则,如果参数与先前由calloc()malloc()posix_memalign()realloc()strdup()函数返回的指针不匹配,或者通过调用free()realloc()取消分配空间,行为未定义