gpt4 book ai didi

c - C 结构上的共享内存无法正常工作

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

我正在开发一个模拟益智游戏的小程序,我可以在其中打印棋盘的状态,或者向上、向下、向左或向右移动,但是当我尝试使用共享内存实现它时遇到问题.我在头文件中有一个结构,它有一个 char *[4][4]在其他文件中都使用了

设置是这样的

// Instance of Board for the current state of the game.
Obj obj; // is initialized but not here for sake of space and post size

struct obj *pobj;

int main()
{
key_t key = ftok("/afs/x/y/z", 'b');
//Make shared memory
size_t BLOCK_SIZE = sizeof(struct Board);
int shmid = shmget(key, BLOCK_SIZE, 0666 | IPC_CREAT);
if (shmid == -1)
{
fail("Cannot create shared memory");
}
pobj = (Obj *) shmat(shmid, 0, 0);
if (pobj == (struct Board *) -1)
{
fail("Can't map shared memory segment into address space");
}obj
// setting pobj values to obj values
for(int i = 0; i < OBJ_ROWS; i++){
for(int j = 0; j < OBJ_COLS; j++){
pobj->field[i][j] = obj.field[i][j];
}
}

//Loop through and print the values just put in, I get the correct values I put in

shmdt( pobj );
return 0;
}

我输入的值是正确的

但是当我通过这个访问时

key_t key = ftok("/afs/x/y/z", 'b');
//Make shared memory
int shmid = shmget( key, BLOCK_SIZE, 0666 | IPC_CREAT );//this IPC_CREAT not needed
if( shmid == -1){
fail( "Cannot create shared memory" );
}
pobj= (OBJ *) shmat(shmid, 0, 0);
if(pobj == (struct Obj *) -1){
fail( "Cannot map shared memory segment into address space" );
}
// loop through and print out values

除了像

这样的垃圾值,我什么也得不到
@ @ ▒▒▒▒▒&▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒▒&▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒
▒E▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒x▒▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒U܋u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒ ▒u܋E▒щ▒▒▒w▒▒▒▒
▒E▒▒}▒~▒▒E▒▒}▒~▒▒

是什么导致了这些值的差异?

编辑:通过从导致问题的第二个文件中删除 IPC_CREAT 并将数组更改为 int[4][4] 来解决问题;

最佳答案

您在两个程序中都创建了一个全新的共享内存块。您想在 reset.c 中创建内存,并在 fifteen.c 中读取它。删除 fifteen.c 中的 IPC_CREAT。您可以了解更多here ,其中系统调用指定:

IPC_CREAT

Create a new segment. If this flag is not used, then shmget() will find the segment associated with key and check to see if the user has permission to access the segment.

还有一点意义不大。字符串字面量是数组,即指针,而您让 Board 只是一堆指针。您在共享内存对象中共享的唯一数据是指针,这对 fifteen.c 没有帮助,fifteen.c 需要查看实际的字符数据。相反,fifteen.c 看到一堆指向 reset.c 中的字符串文字的指针。这不是特别有用,fifteen.c 应该用一堆随机地址做什么? fifteen.c 想要查看实际字母 - 可能是空终止数组。您必须使您的 Board 对象包含字符数组的二维数组(具有确定的长度,例如 16)。然后,您可以在文件中来回共享角色数据。

关于c - C 结构上的共享内存无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52596390/

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