Ошибка сегментации - структура внутри общей памяти - PullRequest
0 голосов
/ 17 декабря 2018

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

typedef struct Struct1{
    int a;
    float b;
} Struct1;

typedef struct Struct2{
    int a;
} Struct2;

typedef struct{
    int c;
    Struct1* str1;
    Struct2* str2;
}Sh_Memory;

void main(){
    int shmid;
    Sh_Memory *shmem;
    //finding total_a and total_b...

    shmid = shmget(IPC_PRIVATE, sizeof(Sh_Memory) + total_a*sizeof(Struct1) + total_b*sizeof(Struct2), 0666);

    shmem = (Sh_Memory *)shmat(shmid,0,0);

    Struct1* struct1 = (Struct1*)((void*)shmem+sizeof(Sh_Memory));
    // ...
    //initialising struct1 with no problem

    Struct2* struct2 = (Struct2*)((void*)(shmem->struct1)+total_b*sizeof(Struct2));
        //wanting to initialize struct2
        (shmem->struct2).a = 0; //SEGFAULT

}

Любая помощь?

РЕДАКТИРОВАТЬ: Моя общая память имеет две разные структуры.Мой главный вопрос - как правильно их инициализировать после доступа к общей памяти.

1 Ответ

0 голосов
/ 17 декабря 2018

Возможно, вы запутались в typedefs и названии некоторых переменных.Я сделал рабочий пример, который, я надеюсь, вы можете использовать для справки.Я должен был заполнить некоторые неизвестные, скажите мне, если намерение кода отличалось от этого.

typedef struct {
    int a;
    float b;
} Struct1;

typedef struct {
    int a;
} Struct2;

typedef struct{
    int c;
    Struct1 *str1;
    Struct2 *str2;
} Sh_Memory;

int main(void)
{
    int shmid;
    Sh_Memory *shmem;
    int total_a = 3;
    int total_b = 3;

    shmid = shmget(IPC_PRIVATE, sizeof(Sh_Memory) + total_a * sizeof(Struct1) + total_b * sizeof(Struct2), 0666);

    shmem = (Sh_Memory *)shmat(shmid, 0, 0);

    shmem->str1 = (Struct1 *)((void *)shmem + sizeof(Sh_Memory));
    /* Init str1 */
    shmem->str1[0].a = 0;
    shmem->str1[0].b = 0.0;
    shmem->str1[1].a = 1;
    shmem->str1[1].b = 1.1;
    shmem->str1[2].a = 2;
    shmem->str1[2].b = 2.2;

    shmem->str2 = (Struct2 *)((void *)(shmem->str1) + total_a * sizeof(Struct1));
    /* Init str2 */
    shmem->str2[0].a = 0;
    shmem->str2[1].a = 1;
    shmem->str2[2].a = 2;

    /* Print str1 */
    for (int i = 0; i < total_a; i++) {
        printf("str1[%d] - a: %d, b: %f\n", i, shmem->str1[i].a, shmem->str1[i].b);
    }

    /* Print str2 */
    for (int i = 0; i < total_a; i++) {
        printf("str2[%d] - a: %d\n", i, shmem->str2[i].a);
    }
}

Вывод:

str1[0] - a: 0, b: 0.000000
str1[1] - a: 1, b: 1.100000
str1[2] - a: 2, b: 2.200000
str2[0] - a: 0
str2[1] - a: 1
str2[2] - a: 2
...