gpt4 book ai didi

c - 尝试将堆上的变量复制到 C 中的共享内存时 Memcpy 失败

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:58 26 4
gpt4 key购买 nike

我正在尝试将我在堆上 malloc 和初始化的结构复制到共享内存中,以便我可以在我想要 fork 的子进程中使用该结构。但是,当我访问 memcpy 时,我收到错误消息,指出我尝试将结构复制到的地址是无效地址。我不确定我哪里搞砸了。

struct OverSharedData{
//pointers to other variables and structs
}

int main(){
struct OverSharedData* remp = (struct OverSharedData*)malloc(sizeof(struct OverSharedData));
initialize(remp);

key_t key = ftok("garbage.txt", 71);
int eyedee = shmget(key, sizeof(struct OverSharedData), IPC_CREAT);
struct OverSharedData* add = (struct OverSharedData *)shmat(eyedee, 0, 0);

memcpy(add, remp, sizeof(struct OverSharedData));
}

编辑:通过 gdb 添加的返回值:

261 struct OverSharedData* add = (struct OverSharedData *)shmat(eyedee, 0, 0);

打印添加$5 = (struct OverSharedData *) 0x8fe005ec(gdb) 下一个第263话(gdb) 打印添加$6 = (struct OverSharedData *) 0xffffffff

最佳答案

奇怪,我今天早些时候遇到了完全相同的事情。

shmget 添加权限:

int eyedee = shmget(key, sizeof(struct OverSharedData), 
IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (eyedee == -1)
{
perror("shmget");
exit(1);
}

检查 shmat 的返回码。

struct OverSharedData *add = (struct OverSharedData *) shmat(eyedee, 0, 0);
if (add == (void *) -1)
{
perror("shmat");
exit(1);
}

关于c - 尝试将堆上的变量复制到 C 中的共享内存时 Memcpy 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23122628/

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