c中的自动分配

automatic allocation in c

1  #define SOME_OPERATION(a,b) a+b
2
3  typedef struct {
4   char* name;
5   int nameLen;
6   int val;
7  } SomeType;
8
9  SomeType* f(int x, int y, int z, char* name)
10 {
11  SomeType a;
12
13  assert(name != NULL);
14  a.name = malloc(strlen(name) + 1);
15  strcpy(a.name, name);
16  assert( (a.nameLen = strlen(name)) > 0 );
17
18  a.val = SOME_OPERATION(x,y) * z;
19  if (a.val < 0) {
20  return NULL;
21 }
22
23 return &a;
24 }

此代码编译成功,但包含一些重大错误。 例如在第 14 行,它不检查 malloc returns 是否为 NULL。 我的问题是,如果此固定代码适用于此特定问题:

if(!a.name)
{
  //or should be in addition free(a)
  return NULL;
}

当我写SomeType a时,是否意味着分配了一个指向SomeType的新指针?

For example in line 14, there it doesn't check if malloc returns NULL. My question is, if this fixed code works for this specific issue:

不,你的直觉是正确的。每个 malloc(或 realloced 区域)需要一个 free.

When I write SomeType a, Does it mean that a new pointer to SomeType was allocated?

不,这需要一个 构造函数 - C 语言中没有的东西。您将必须创建免费的构造 函数以在 C 中类似地管理关系。

My question is, if this fixed code works for this specific issue:

if(!a.name)
{
  //or should be in addition free(a)
  return NULL;
}

a 不是指针。 a 是结构类型 SomeType 的对象。所以没有什么可以免费的。

When I write SomeType a, Does it mean that a new pointer to SomeType was allocated?

两个指针都没有分配。定义了 SomeType 类型的对象 a 具有自动存储持续时间。

返回指向对象的指针

return &a

使指针无效,因为对象a退出函数后不会存活。在函数的调用者中取消引用此类指针会导致未定义的行为。

您可以 return 一个 SomeType 类型的对象本身,而不是 return 指向类型 SomeType 对象的指针。

首先,您应该正确格式化问题中的代码。

  1. 您return 引用了自动变量。该变量在函数return之后不存在。这是未定义的行为。

您需要动态分配这个对象:

SomeType *a = malloc(sizeof(*a));

return a;