我是C的初学者,我在尝试在main函数之外分配内存时遇到了麻烦。
我的目标是创建一个int大小的指针(在我的struct中)。如果它具有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));
}
}
我希望data
应该被main识别为具有int
的大小,如果你可以帮助我如何在之后释放相同的指针,那将是非常有帮助的。谢谢。
这根本不可能直接。您无法通过分配器函数从返回的指针获取已分配内存的大小。
最好的选择是,使用另一个成员变量来存储已分配内存的大小,并在分配成功后使用size值更新。
那说,
if(ptr->data == NULL)
正如您可能预期的那样,不太可能是正确的,因为ptr->data
未初始化且内容不确定。无论如何,你必须让ptr->data
指向一个有效的内存位置,所以检查无论如何都没有任何意义。
正如所指出的,你的结构是未初始化的,所以它不太可能填充NULL
。在C中获得零初始化结构的最简单方法是使用{0}
:
struct info a = {0};
您可以通过直接调用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);
}