一个奇怪的C结构体 -- C的结构体成员隐藏

参考自b站up主

详情链接

main.c

int main() {

	Person* p = PersonNew("aaa", 10, NULL);
	PersonToString(p);
	PersonDestroy(&p);
	
	void* p1 = PersonNew("bbb", 10, NULL);
	PersonToString((Person*)p1);
	PersonDestroy((Person**)&p1);





	//fopen();

	return 0;

}

Person.h

#include<stdlib.h>

#include<stdio.h>
#include<string.h>

typedef struct 
{
	void* _Placeholder;

} Person;

Person* PersonNew(char const* name, int age, char const* intro);

char const* PersonGetName(Person const* p);

int PersonGetAge(Person const* p);

void PersonToString(Person const* p);

void PersonDestroy(Person** ptr);

Person.c


#include"Person.h"

typedef struct
{
	union 
	{
		Person public_person;
		char const* name;
	};
	int age;
	char intro[];
}PersonInternal;
;

Person* PersonNew(char const* name, int age, char const* intro) {

	size_t intro_len = (intro ? strlen(intro) : 0) + 1;
	PersonInternal* p = (PersonInternal*)malloc(sizeof(PersonInternal) + intro_len);
	p->age = age;
	p->name = name;
	if (intro)
	{
		strcpy(p->intro, intro);
	}
	else
	{
		p->intro[0] = 0;
	}
	return &p->public_person;
}

char const* PersonGetName(Person const* p){

	return ((PersonInternal*)p)->name;
}

int PersonGetAge(Person const* p) {

	return ((PersonInternal*)p)->age;
}

void PersonToString(Person const* p) {

	PersonInternal* person_internal = (PersonInternal*)p;
	printf("Person{name=%s,age=%d,intro=%s}\n",person_internal->name, person_internal->age, person_internal->intro);
}

void PersonDestroy(Person** ptr) {

	if (ptr && *ptr)
	{
		free(*ptr);
		*ptr = NULL;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值