如何在struct和outside main中分配内存?

问题描述 投票:2回答:2

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

c pointers memory-management data-structures
2个回答
0
投票

这根本不可能直接。您无法通过分配器函数从返回的指针获取已分配内存的大小。

最好的选择是,使用另一个成员变量来存储已分配内存的大小,并在分配成功后使用size值更新。

那说,

if(ptr->data == NULL)

正如您可能预期的那样,不太可能是正确的,因为ptr->data未初始化且内容不确定。无论如何,你必须让ptr->data指向一个有效的内存位置,所以检查无论如何都没有任何意义。


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);
}
© www.soinside.com 2019 - 2024. All rights reserved.