C - 重用缓冲区指针 _before_ 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分配给''(即 tmp = ''; ),或者在每次作业之间执行类似memset(tmp, '', sizeof tmp)的操作

您的第一个代码示例还可以(除了sizeof问题)。你分配一些内存,然后将内容写入其中,然后用其他内容覆盖它。

在第二个代码示例中,它不会执行您认为它执行的操作。该行:

tmp = "foo";

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

代码应为:

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

相关内容

  • 没有找到相关文章

最新更新