这样分配内存有什么区别吗?
Is there any difference on allocating memory like this?
我想我有一个初学者的疑问。我不知道这是不是一个很愚蠢的问题,但这两种情况之间有什么区别:
通用结构:
typedef struct {
void* data;
} Object;
第一种情况:这种情况在指针上分配内存,然后返回指针。
Object* NewObject1(const void* data) {
Object* This = (Object*)malloc(sizeof(Object));
memcpy_s(&This->data, sizeof(void**), &data, sizeof(void**));
return This;
}
第二种情况:在这种情况下,内存分配在用户给定的指针上。
void NewObject2(Object** This, const void* data) {
*This = (Object*)malloc(sizeof(Object));
memcpy_s(&(*This)->data, sizeof(void**), &data, sizeof(void**));
}
结果其实是一样的:
int main(){
Object* a = NewObject1((void*)10);
printf("a->data = %d\n", (int)a->data);
Object* b = NULL;
NewObject2(&b, (void*)10);
printf("b->data = %d\n", (int)b->data);
return 0;
}
输出:
a->data = 10
b->data = 10
所以我的问题是:在第一种情况和第二种情况下分配内存之间存在任何真正的区别。比如内存安全、性能等
两种方法return取值相同。您可以按值 return,或使用指向应写入 "returned" 值的位置的指针参数。
但是您的代码还有其他一些奇怪的地方:
- 而不是
memcpy_s
,您应该分别写 This->data = data;
和 (*This)->data = data;
。并修复常量正确性。
(void *)10
可能不是有效地址,这可能会导致陷阱、总线错误或其他问题。 (如果它不是实际对象的地址,则为未定义行为)
- 转换 malloc 的结果是多余的或更糟。
- 应检查 malloc 的 return 值。
我想我有一个初学者的疑问。我不知道这是不是一个很愚蠢的问题,但这两种情况之间有什么区别:
通用结构:
typedef struct {
void* data;
} Object;
第一种情况:这种情况在指针上分配内存,然后返回指针。
Object* NewObject1(const void* data) {
Object* This = (Object*)malloc(sizeof(Object));
memcpy_s(&This->data, sizeof(void**), &data, sizeof(void**));
return This;
}
第二种情况:在这种情况下,内存分配在用户给定的指针上。
void NewObject2(Object** This, const void* data) {
*This = (Object*)malloc(sizeof(Object));
memcpy_s(&(*This)->data, sizeof(void**), &data, sizeof(void**));
}
结果其实是一样的:
int main(){
Object* a = NewObject1((void*)10);
printf("a->data = %d\n", (int)a->data);
Object* b = NULL;
NewObject2(&b, (void*)10);
printf("b->data = %d\n", (int)b->data);
return 0;
}
输出:
a->data = 10
b->data = 10
所以我的问题是:在第一种情况和第二种情况下分配内存之间存在任何真正的区别。比如内存安全、性能等
两种方法return取值相同。您可以按值 return,或使用指向应写入 "returned" 值的位置的指针参数。
但是您的代码还有其他一些奇怪的地方:
- 而不是
memcpy_s
,您应该分别写This->data = data;
和(*This)->data = data;
。并修复常量正确性。 (void *)10
可能不是有效地址,这可能会导致陷阱、总线错误或其他问题。 (如果它不是实际对象的地址,则为未定义行为)- 转换 malloc 的结果是多余的或更糟。
- 应检查 malloc 的 return 值。