Malloc和C中的自由循环

时间:2017-03-03 01:04:57

标签: c pointers struct malloc free

是否始终需要匹配malloc()和free()调用?我必须为结构分配动态内存,然后在一些操作后释放它。我可以覆盖动态内存中的数据,或者我应该先将它们释放出来并再次释放malloc吗?例如:

int x =5,len = 100;

do{
    struct test *test_p = (struct test *) malloc(sizeof(struct test) + len);

 /* ---do some operation ----------  */

    free(test_p);
    x--;
}while(x);

另一种方法是在循环之前执行malloc并在循环中执行free()。释放后我可以使用这个结构指针吗?例如:

int x =5, len = 100;
struct test *test_p = (struct test *) malloc(sizeof(struct test) + len);

do{

 /* ---do some operation ----------  */

    free(test_p);
    x--;
}while(x);

提前感谢您的帮助和建议。

3 个答案:

答案 0 :(得分:1)

假设这是使用灵活阵列方法并且您的分配有意义,您可以在每次迭代期间重用您的内存。这将为您节省大量的时间来分配和释放。

int x =5,len = 100;

struct test* test_p = malloc(sizeof *test_p + len);
do {
    // do some operation using test_p
    x--;
} while(x);
free(test_p);

如果要在每次迭代时“清除”结构,可以在循环开始时使用复合文字。

do {
    *test_p = (struct test){0};

there are better ways to malloc

答案 1 :(得分:0)

当您不再需要对象时,释放对象始终是一个好习惯。在您的情况下,如果您在test循环的每次迭代中使用while结构,我会按如下方式编写代码:

int x =5,len = 100;
struct test *test_p = (struct test *) malloc(sizeof(struct test) + len);
do{
    /* ---do some operation ----------  */

    x--;
}while(x);
free(test_p);

答案 2 :(得分:0)

在您的代码中:

int x =5, len = 100;
struct test *test_p = (struct test *) malloc(sizeof(struct test) + len);

do{

 /* ---do some operation ----------  */

    free(test_p);
    x--;
}while(x);

致电free(test_p);后,您不应再次使用test_p。这意味着test_p仅在循环的第一个时间内有效。