我是C语言的初学者,尝试在主函数之外分配内存时遇到了麻烦。
我的目标是创建一个int大小的指针(在我的结构内)。如果它具有TypeError at /v1/foo/bar
foo_bar() got an unexpected keyword argument 'version'
值,则将其传递给struct元素,并且必须能够识别为主函数。
我尽了我所能想象的一切,但是我从来没有像以前那样被困过,对不起,我没有提供更多信息。
NULL
我希望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
,并且如果以后可以帮助我释放相同的指针,那将非常有帮助。谢谢。
答案 0 :(得分:0)
这根本不可能直接实现。分配器函数无法从返回的指针获取分配的内存大小。
最好的选择是,一旦分配成功,让另一个成员变量存储分配的内存的大小,并用size的值进行更新。
那是
if(ptr->data == NULL)
如您所料,不可能为TRUE,因为ptr->data
未初始化,内容不确定。无论如何,您都必须使ptr->data
指向有效的内存位置,以便该检查始终没有任何意义。
答案 1 :(得分:0)
如前所述,您的结构未初始化,因此不可能用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);
}