Возможно ли, чтобы все структурные ссылки определенного типа ссылались на один и тот же экземпляр другой структуры? С - PullRequest
0 голосов
/ 03 ноября 2018

Я не лучший программист на Си, который когда-либо жил, так что это может быть глупым вопросом, но есть ли способ для всех типов конкретной структуры ссылаться на один и тот же экземпляр структуры другой структуры?

Примером этого может быть:

    #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)?

Так что, если есть какие-либо указатели на это или какие-либо идеи, было бы очень желательно.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Память, возвращаемая 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.

0 голосов
/ 03 ноября 2018

int idxgiver находится в глобальной области видимости. Код работает как надо. Если вы хотите, чтобы componentA_t и componentB_t имели разные idxgiver с, сделайте это так, определив два idxgiver с.

...