1

C \ Linuxで共有メモリセグメントを使用してIPCを実行しようとしています。

私は通常のようにそれを作成し続けます:

typedef struct {
    int a[2];
} shm_segment;

...

shm_segment *shm;

int shm_id;
int shm_flags = IPC_CREAT | 0666
int shm_size = sizeof(struct shm_segment)
key_t key = 88899;
shm_id = shmget(key, shm_size, shm_flags); // ies this is in an if for error cheking but for example sake i omitted it

shm = (shm_segment*)shmat(shm_id, (void*)0, 0);

最後の行はそれが壊れている場所で、コンパイル時に次のようになります:

Warning cast to pointer from integer of a different size.

このコードが32ビットマシンで完全に機能する前に行ったことから(警告なし)(まったく同じコードをテストしていませんが、同じです)、64ビットではコンパイル時にこの警告が表示されます。

そして、実行時にセグメンテーション違反を起こします。私が行った調査から、void* からポインターへのキャストは、64 ビットの原因から、ポインターを混乱させると考えています。

どうすればこの人を修正できますか?または何が原因ですか?

4

2 に答える 2

2

の正しい宣言が欠落しているように聞こえるshmat()ため、コンパイラはそれが を返すと想定していますint

あなたが持っていることを確認してください

#include <sys/shm.h>

あなたのインクルードで。

于 2009-12-06T02:29:41.433 に答える
2

キャストを取り除き、適切なヘッダーを含めます。

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
于 2009-12-06T02:32:02.940 に答える