我不是有史以来最伟大的C程序员,所以这可能是一个愚蠢的问题,但是是否有一种方法可以让所有类型的特定结构引用另一个结构的相同结构实例?
例如:
#include <stdio.h>
#include <stdlib.h>
int idxgiver;
typedef struct component component_t;
typedef struct componentA componentA_t;
typedef struct componentB componentB_t;
static struct component{
int idx;
};
struct componentA{
component_t component;
};
struct componentB{
component_t component;
};
componentA_t *componentA_init(){
componentA_t *a = malloc(sizeof(componentA_t));
if(a->component.idx == 0){
a->component.idx = idxgiver;
idxgiver++;
}
return a;
}
componentB_t *componentB_init(){
componentB_t *b = malloc(sizeof(componentB_t));
if(b->component.idx == 0){
b->component.idx = idxgiver;
idxgiver++;
}
return b;
}
int main(){
componentA_t *a = componentA_init();
componentB_t *b = componentB_init();
printf("%d\n", a->component.idx);
printf("%d\n", b->component.idx);
componentB_t *b2 = componentB_init();
printf("%d\n", b2->component.idx);
return 0;
}
此代码的目标是根据组件的类型为每个组件赋予其独特的值,因此,理想情况下,这段代码的结果将是组件A的值为0(它的工作方式是)。组件B的值是1(它的确是),组件B2的值也是1(不是2)?
因此,如果有任何指向此主题或任何想法的指针,将非常欢迎。
答案 0 :(得分:0)
由malloc
返回的内存未初始化。因此,当您使用malloc
为结构分配空间时:
componentA_t *a = malloc(sizeof(componentA_t));
然后检查该结构的字段:
if(a->component.idx == 0){
您正在读取未初始化的值。因此它可以是0或任何其他值。
不需要进行此检查,因此只需将其删除:
componentA_t *componentA_init(){
componentA_t *a = malloc(sizeof(componentA_t));
a->component.idx = idxgiver;
idxgiver++;
return a;
}
componentB_t *componentB_init(){
componentB_t *b = malloc(sizeof(componentB_t));
b->component.idx = idxgiver;
idxgiver++;
return b;
}
还请注意,idxgiver
未被显式初始化,但是由于它是在文件范围内定义的,因此它被隐式初始化为0。
答案 1 :(得分:-1)
int idxgiver
在全球范围内。该代码可以正常工作。如果希望componentA_t
和componentB_t
具有不同的idxgiver
,则可以通过定义两个idxgiver
来实现。