我认为我有一个初学者的疑问。我不知道这是否是一个非常愚蠢的问题,但这两种情况之间有什么区别:
通用结构:
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
所以我的问题是:在第一种情况下或在第二种情况下,分配内存之间存在任何实际差异。例如,内存安全性,性能等。
两种返回值的方法相同。您可以按值返回,也可以使用指向应将“返回的”值写入何处的指针参数。
但是您的代码还有其他一些奇怪的事情:
memcpy_s
,您只需分别写入This->data = data;
和(*This)->data = data;
。并修复const正确性。(void *)10
可能不是有效的地址,这可能会导致陷阱,总线错误或其他问题。 (如果不是实际对象的地址,则为未定义的行为)