繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM