gpt4 book ai didi

c - 段错误 - 共享内存内部的结构

转载 作者:行者123 更新时间:2023-11-30 19:03:33 25 4
gpt4 key购买 nike

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

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

}

有什么帮助吗?

编辑:我的共享内存有两个不同的结构。我的主要问题是如何在访问共享内存后正确初始化这些。

最佳答案

您可能搞乱了类型定义和某些变量的命名。我做了一个工作示例,希望您可以引用。我必须填写一些未知数来告诉我代码的意图是否与此不同。

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

关于c - 段错误 - 共享内存内部的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53807908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com