我仍然是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)
之类的操作
答案 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);