我是 C 语言的新手,试图弄清楚 C 语言中的内存分配,我有点困惑
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int a;
} struct1_t;
int main()
{
funct1(); //init pointer
return 1;
}
int funct2(struct1_t *ptr2struct)
{
printf("print a is %d\n",ptr2struct->a);
//free(ptr2struct);
printf("value of ptr in funct2 is %p\n", ptr2struct);
return 1; //success
}
int funct1(){
struct1_t *ptr2struct = NULL;
ptr2struct = malloc(sizeof(*ptr2struct));
ptr2struct->a = 5;
printf("value of ptr before used is %p", ptr2struct);
if (funct2(ptr2struct) == 0) {
goto error;
}
free(ptr2struct);
printf("value of ptr in funct1 after freed is is %p\n", ptr2struct);
return 1;
error:
if(ptr2struct) free(ptr2struct);
return 0;
}
我有函数 1 调用函数 2,在使用 funct1 中分配的指针后,我尝试释放该指针。我创建了一种情况,如果 funct2 中的返回值不是 1,则再次尝试释放指针。
我的问题如下
如果我应该释放 funct2 中的内存(在我传递它之后)或在 funct1 中(在我完成获取 funct1 的返回值之后),哪种做法更好
第二件事是这样是否正确会导致goto错误,并且错误:
if(ptr2struct) free(ptr2struct);
我的第三个问题是,如何检查分配的值是否已释放?因为在获取返回值后,我释放了指针,但是如果我打印它,它会显示与分配的位置相同的位置(因此不是空指针)。
对指针调用 free() 不会改变它,只会将内存标记为空闲。您的指针仍将指向包含相同值的同一位置,但该值现在可以随时被覆盖,因此您永远不应该在释放指针后使用它。为了确保这一点,最好在释放指针后始终将其设置为 NULL。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)