对象创建
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 拆成两步,好处是可以在栈上分配、可以复用已有内存。