这样分配内存是否有区别?

问题描述 投票:0回答:1

我认为我有一个初学者的疑问。我不知道这是否是一个非常愚蠢的问题,但这两种情况之间有什么区别:

通用结构:

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

所以我的问题是:在第一种情况下或在第二种情况下,分配内存之间存在任何实际差异。例如,内存安全性,性能等。

c memory memory-management heap-memory low-level
1个回答
0
投票

两种返回值的方法相同。您可以按值返回,也可以使用指向应将“返回的”值写入何处的指针参数。

但是您的代码还有其他一些奇怪的事情:

  • 而不是memcpy_s,您只需分别写入This->data = data;(*This)->data = data;。并修复const正确性。
  • (void *)10可能不是有效的地址,这可能会导致陷阱,总线错误或其他问题。 (如果不是实际对象的地址,则为未定义的行为)
  • 投射malloc的结果是多余的或更糟。
  • 应检查malloc的返回值。
© www.soinside.com 2019 - 2024. All rights reserved.