我正在开发一个模拟益智游戏的小程序,在那里我可以打印出棋盘的状态,或者上下左右移动,但是当我尝试用共享内存实现它时遇到了问题。我在头文件中有一个结构,它有一个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
中读取它。移除IPC_CREAT
中的fifteen.c
。您可以了解更多here,其中syscall指定:
IPC创建
创建新段。如果不使用此标志,则
shmget()将找到与键和
检查用户是否具有访问
段。
还有一些事情没有什么意义。字符串文字是数组,也就是指针,而你只做了一堆指针。共享内存对象中共享的唯一数据是指针,这对fifteen.c
没有帮助,fifteen.c
需要查看实际的字符数据。相反,fifteen.c
看到一堆指针指向reset.c
中的字符串文本。这不是特别有用,对于一堆随机地址,fifteen.c
应该怎么做?fifteen.c
希望看到实际的字母-可能是以空结尾的数组。你必须使你的Board对象包含一个2D字符数组(比如,16)。然后,可以在文件中来回共享字符数据。
关于c - C结构上的共享内存无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52596390/