在我的程序中,我在共享内存中使用了两个结构。我正在初始化第一个结构,没有任何问题,但是第二个结构的初始化不断使我返回分段错误。我尝试了很多方法来解决它,但可能我缺少了一些东西……
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
}
有帮助吗?
编辑:我的共享内存具有两个不同的结构。 我的主要问题是在访问共享内存后如何正确地将这些初始化为。
答案 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