这样分配内存有什么区别吗?

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 值。