对象创建

C 没有 new,对象创建 = 分配内存 + 初始化,分两种情况:

分配位置写法对应 Java
Point p; Point_init(&p, ...);
Point* p = Point_new(...);new Point(...)

结构体定义

typedef struct {
    char name[32];
    int x;
    int y;
} Point;

初始化函数(不分配内存,只写数据)

void Point_init(Point* p, const char* name, int x, int y) {
    strncpy(p->name, name, sizeof(p->name) - 1);
    p->name[sizeof(p->name) - 1] = '\0';
    p->x = x;
    p->y = y;
}

构造器(分配 + 初始化)

Point* Point_new(const char* name, int x, int y) {
    Point* p = malloc(sizeof(Point));     // 堆上分配
    if (p) {
        Point_init(p, name, x, y);        // 写入数据
    }
    return p;
}

void Point_del(Point* p) {
    free(p);
}

使用示例

/* 栈 —— 已划好空间,但内容是垃圾数据,必须 init 后才能用 */
Point p1;
Point_init(&p1, "stack", 10, 20);

/* 堆 —— Point_new 内部 = malloc + Point_init */
Point* p2 = Point_new("heap", 30, 40);
Point_del(p2);

关键理解

  • Point p1; 只是在栈上划了 sizeof(Point) 字节的空间,里面的值是未定义的(垃圾数据),必须初始化后才能用。
  • Point_init 不分配内存,它只负责往你传入的地址写入数据。内存来自栈还是堆,它不关心。
  • Point_new 内部 = malloc + Point_init,这就是 C 的"构造器"。
  • Java 的 new Point(...) 把"分配"和"初始化"合为一步;C 拆成两步,好处是可以在栈上分配、可以复用已有内存。