1
struct shared_memory_t {
    int value1; 
    int value2;
    char* buffer; 
};

shmid = shmget(key, sizeof(shared_memory_t) + segsize, 0666|IPC_CREAT);
shared_memory_t* mem = (shared_memory_t*) shmat(*shmid, NULL, 0);

所以我试图将共享内存映射到自定义结构。现在我不知道 segsize 有多大,直到用户启动程序并输入一个值。我希望缓冲区是指向 int 值之后的内存空间开头的指针。现在,如果我这样做,我会遇到内存故障。我可以附加它并通过以下方式获取起始内存空间:

void* mem = shmat(shmid, NULL, 0);

关于如何使其处于可以执行 mem->value1 并访问数据缓冲区以获取原始数据字节的状态的任何提示?

4

1 回答 1

1

使用灵活的数组成员

struct shared_memory_t {
    int value1; 
    int value2;
    char buffer[]; // flexible array member
};

shmid = shmget(key, sizeof(shared_memory_t) + segsize, 0666|IPC_CREAT);
shared_memory_t* mem = (shared_memory_t*) shmat(shmid, NULL, 0);
memset(mem.buffer, 42, segsize); // all valid
于 2021-11-06T02:17:36.263 回答