重用缓冲区指针_before_ free

时间:2015-01-16 00:35:24

标签: c pointers malloc free

我仍然是C的新手,特别是动态内存分配:在没有重新初始化的情况下,在其定义和可能的free 之间重用缓冲区指针是否安全?

我说可能是免费的,因为指针可以指向静态分配的缓冲区:

char buf[1024];
char *bufp = buf;

因此,如果我有一个名为tmp的缓冲区指针,我是否需要重新初始化它才能保证以前的任务将被覆盖?

这些是安全的吗?

  • 指针的内存由函数

    填充
    char *tmp = malloc(sizeof(char)*1024);
    FILE *fp = fopen("/foo");
    
    // initial assignment
    fgets(tmp, sizeof tmp, fp);
    fclose(fp);
    
    fp = fopen("/bar");
    // does this replace the previous assignment?
    fgets(tmp, sizeof tmp, fp);
    
    fclose(fp);
    free(tmp);
    
  • 指针的内存填充内联

    char *tmp = malloc(sizeof(char)*1024);
    tmp = "foo";
    /* `tmp' gets used, but not free'd or assigned */
    
    tmp = "bar";
    /* ... */
    
    free(tmp);
    

或者我应该将tmp分配给'\0'(即tmp = '\0';),还是在每次作业之间执行memset(tmp, '\0', sizeof tmp)之类的操作

1 个答案:

答案 0 :(得分:3)

您的第一个代码示例正常(除了sizeof问题)。你分配了一些内存,然后把东西写入其中,然后用其他东西覆盖它。

在第二个代码示例中,它没有做你认为它做的事情。这一行:

tmp = "foo";

使tmp指向已存储"foo"的内存部分。它不会将foo复制到tmp当前指向的位置。这导致内存泄漏,因为现在没有指向malloc' d

的区域的指针。

代码应为:

char *tmp = malloc(1024);    // sizeof(char) always 1
strcpy(tmp, "foo");
strcpy(tmp, "bar");
free(tmp);