分段错误-共享内存内部结构

时间:2018-12-17 01:15:30

标签: c segmentation-fault

在我的程序中,我在共享内存中使用了两个结构。我正在初始化第一个结构,没有任何问题,但是第二个结构的初始化不断使我返回分段错误。我尝试了很多方法来解决它,但可能我缺少了一些东西……

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 :(得分:1)

您可能搞砸了typedef和一些变量的命名。 我做了一个工作示例,希望您可以参考。 我必须填写一些未知数,告诉我代码的意图是否与此不同。

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