[英]How to allocate memory inside a struct and outside main?
我是C语言的初学者,尝试在main函数之外分配内存时遇到了麻烦。
我的目标是创建一个int大小的指针(在我的结构内部)。 如果它具有NULL
值,则将其传递给struct元素,并且必须能够被main函数识别。
我尝试了所有我能想象得到的东西,但是我从来没有像现在这样被困过,对不起,我没有提供更多信息。
struct info {
int *data;
};
void allocate(struct info *ptr);
int main()
{
struct info *p;
struct info a;
p = &a;
allocate(p);
free(p->data);
return 0;
}
void allocate(struct info *ptr)
{
if(ptr->data == NULL)
{
ptr->data = malloc(sizeof(int));
}
}
我希望main可以识别出data
的大小为int
,如果以后您可以帮助我如何释放相同的指针,那将非常有帮助。 谢谢。
根本不可能直接做到这一点。 分配器函数无法从返回的指针中获取分配的内存大小。
最好的选择是让另一个成员变量存储分配的内存的大小,并在分配成功后使用size的值进行更新。
那就是
if(ptr->data == NULL)
正如您所期望的那样,它不太可能是TRUE,因为ptr->data
初始化,并且内容是不确定的。 无论如何,您都必须使ptr->data
指向一个有效的内存位置,因此无论如何该检查都没有任何意义。
如前所述,您的结构未初始化,因此不太可能用NULL
填充。 在C中获取零初始化结构的最简单方法是使用{0}
:
struct info a = {0};
您可以通过调用allocate(&a);
消除多余的p
变量allocate(&a);
直。
举一个简单的例子:
int main(void) {
int *p;
if (p == NULL) { // probably false
// ...
}
}
上面的指针未初始化。 与其他语言(例如Java)不同, p
不能保证是任何东西。
我建议您执行的另一种方法是创建帮助程序函数,以创建和销毁info
对象。
#include <stdlib.h>
struct info {
int *data;
};
struct info* new_info(void);
void free_info(struct info* p);
int main(void) {
struct info *p = new_info(); // user doesn't worry about creation details
// ... use p ...
free_info(p); // user doesn't worry about deletion details
}
struct info* new_info(void) {
struct info* p = malloc(sizeof *p);
p->data = malloc(sizeof *p->data);
return p;
}
void free_info(struct info* p) {
free(p->data);
free(p);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.