MST

星途 面试题库

面试题:C语言结构体初始化:面向对象思想与初始化策略

在C语言中通过结构体模拟一个简单的“图形”类,有一个通用的结构体 `shape` 作为基类,包含颜色属性。然后派生出 `circle` 结构体(继承自 `shape`),新增半径属性;`rectangle` 结构体(继承自 `shape`),新增长和宽属性。要求设计一套初始化策略,使得能够方便地初始化不同类型的图形结构体,并且能够保证初始化过程的安全性和可维护性。请写出完整的结构体定义及初始化相关代码。
42.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>

// 定义基类shape
typedef struct shape {
    char *color;
} shape;

// 定义circle结构体,继承自shape
typedef struct circle {
    shape base;
    double radius;
} circle;

// 定义rectangle结构体,继承自shape
typedef struct rectangle {
    shape base;
    double length;
    double width;
} rectangle;

// 初始化shape的函数
void init_shape(shape *s, const char *color) {
    s->color = (char *)malloc(strlen(color) + 1);
    if (s->color == NULL) {
        fprintf(stderr, "Memory allocation failed\n");
        exit(EXIT_FAILURE);
    }
    strcpy(s->color, color);
}

// 初始化circle的函数
void init_circle(circle *c, const char *color, double radius) {
    init_shape(&c->base, color);
    c->radius = radius;
}

// 初始化rectangle的函数
void init_rectangle(rectangle *r, const char *color, double length, double width) {
    init_shape(&r->base, color);
    r->length = length;
    r->width = width;
}

// 释放shape内存的函数
void free_shape(shape *s) {
    free(s->color);
}

// 释放circle内存的函数
void free_circle(circle *c) {
    free_shape(&c->base);
}

// 释放rectangle内存的函数
void free_rectangle(rectangle *r) {
    free_shape(&r->base);
}

int main() {
    circle c;
    init_circle(&c, "red", 5.0);
    printf("Circle: color = %s, radius = %lf\n", c.base.color, c.radius);
    free_circle(&c);

    rectangle r;
    init_rectangle(&r, "blue", 4.0, 6.0);
    printf("Rectangle: color = %s, length = %lf, width = %lf\n", r.base.color, r.length, r.width);
    free_rectangle(&r);

    return 0;
}