Как выделить память для массива структур? - PullRequest
0 голосов
/ 05 октября 2019

У меня есть библиотека C ++ (на самом деле обертка для другой библиотеки C ++), и мне нужно передать struct s моему приложению C.

Я не знаю, как динамически распределять память.

Я получаю ошибку сегментации.

library.h

struct my_substruct {
    unsigned char                   id                    ;
    time_t                          date                  ;
    char                            *info                 ;
};
typedef struct my_substruct         My_substruct          ;

struct my_struct {
    char                            *description          ;
    unsigned char                   value                 ;
    My_substruct                    *substruct            ;
};
typedef my_struct                   My_struct             ;

library.cpp

unsigned char getStructs(My_struct *structs)
{
    vector <structCPPLibrary> structsCPPLibrary = getFromCPPLibrary();
    unsigned char numStructs                    = structsCPPLibrary.size();
    structs                                     = (My_struct *)malloc(numStructs*sizeof(My_struct));
    unsigned char indexStruct                   = 0;
    for (auto s : structsCPPLibrary)
    {
        structs[indexStruct].description        = (char *)malloc(s.description.size() + 1);
        strcpy(structs[indexStruct].description, s.description.c_str()); // In 's' is a std::string
        structs[indexStruct].value              = s.value;               // In 's' is an unsigned char too
        unsigned char numSubstructs             = s.substructs.size();   // In 's' is a vector of Substructs
        structs[indexStruct].substruct          = (My_substruct *)malloc(numSubstructs*sizeof(My_substruct));
        unsigned char indexSubstruct            = 0;
        for (auto sub : s.substruct) {
            structs[indexStruct].substruct[indexSubstruct].id   = sub.id;    // In 'sub' is an unsigned char too
            structs[indexStruct].substruct[indexSubstruct].date = sub.date;  // In 'sub' is a time_t too
            structs[indexStruct].substruct[indexSubstruct].info = (char *)malloc(sub.info.size() + 1);
            strcpy(structs[indexStruct].substruct[indexSubstruct].info, sub.info.c_str()); // In 'sub' is a std::string
            indexSubstruct++;
        }
        indexStruct++;
    }
    return indexStruct;
}

main.c

void getStructFromWrapper(void)
{
    My_struct *structs;
    unsigned char numStruct = getStructs(structs);
    show_content(structs);
}

1 Ответ

1 голос
/ 05 октября 2019

Изменить

unsigned char getStructs(My_struct *structs) {
    ...
}
getStructs(structs);

На

unsigned char getStructs(My_struct **p_structs) {
    // C function can't be pass by reference, so convert to a reference here
    auto& struct = *p_structs;  
    ...
}
...
getStructs(&structs);

Ваша проблема в том, что ваша строка struct = ... не изменяет значение structs в getStructFromWrapper.

...