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
(或 realloc
ed 区域)需要一个 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
对象的指针。
首先,您应该正确格式化问题中的代码。
- 您return 引用了自动变量。该变量在函数return之后不存在。这是未定义的行为。
您需要动态分配这个对象:
SomeType *a = malloc(sizeof(*a));
和
return a;
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
(或 realloc
ed 区域)需要一个 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
对象的指针。
首先,您应该正确格式化问题中的代码。
- 您return 引用了自动变量。该变量在函数return之后不存在。这是未定义的行为。
您需要动态分配这个对象:
SomeType *a = malloc(sizeof(*a));
和
return a;