如何在struct和main内部分配内存?

时间:2019-04-25 17:52:31

标签: c pointers memory-management data-structures

我是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,并且如果以后可以帮助我释放相同的指针,那将非常有帮助。谢谢。

2 个答案:

答案 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);
}