我对 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);