gpt4 book ai didi

c - C中的多态性

转载 作者:太空狗 更新时间:2023-10-29 15:40:47 25 4
gpt4 key购买 nike

我正在编写一个 C 程序,我在其中定义了两种类型:

typedef struct {

uint8_t array[32];
/* struct A's members */
...

} A;

typedef struct {

uint8_t array[32];
/* struct B's members, different from A's */
...

} B;

现在我想构建一个能够管理两种类型的数据结构,而不必为类型 A 和类型 B 编写一个,假设两者都有一个 uint8_t [32] 作为它们的第一个成员。

我阅读了如何在 C 中实现一种多态性 here我还读了here结构成员的顺序保证由编译器按照程序员编写的顺序保存。

我想到了下面的想法,如果我定义下面的结构呢:

typedef struct {
uint8_t array[32];
} Element;

并定义一个只处理元素类型数据的数据结构?这样做是否安全:

void f(Element * e){
int i;
for(i = 0; i < 32; i++) do_something(e->array[i]);
}

...

A a;
B b;
...
f(((Element *)&a));
...
f(((Element *)&b));

乍一看不干净,但我想知道是否有任何保证它不会破裂?

最佳答案

如果 array 始终是您的结构中的第一个,您可以简单地通过转换指针来访问它。不需要结构 Element。您的数据结构可以存储空指针。

typedef struct {
char array[32];
} A;

typedef struct {
void* elements;
size_t elementSize;
size_t num;
} Vector;

char* getArrayPtr(Vector* v, int i) {
return (char*)(v->elements) + v->elementSize*i;
}

int main()
{
A* pa = malloc(10*sizeof(A));
pa[3].array[0] = 's';
Vector v;
v.elements = pa;
v.num = 10;
v.elementSize = sizeof(A);
printf("%s\n", getArrayPtr(&v, 3));
}

关于c - C中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22849103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com