c - 为什么共享内存中的 memcpy 会出现段错误

标签 c struct shared-memory mmap memcpy

我当前的项目有问题。

这是我的标题:

#define SHARED_MEMORY_NAME "/osmpmemory"
#define OSMP_MAX_MESSAGES_PROC 16
#define OSMP_MAX_SLOTS 256
#define OSMP_MAX_PAYLOAD_LENGTH 128

typedef struct {
        char msg[OSMP_MAX_PAYLOAD_LENGTH];
    } osmp_msg;

typedef struct {
        size_t memory_size;
        int process_count;
        osmp_msg slots[OSMP_MAX_SLOTS];
    } shm_conf;

这是我的代码:

shm_conf* memory_conf;
size_t shm_size =  sizeof(shm_conf) + sizeof(int[count][2]) + sizeof(osmp_msg[count][OSMP_MAX_MESSAGES_PROC]);
int fd;

if((fd = shm_open(SHARED_MEMORY_NAME, O_CREAT | O_RDWR, 0640)) == -1) {
        return -1;
    }

if(ftruncate(fd, shm_size) == -1) {
        printf("%s\n", strerror(errno));
        return -1;
    }


if((memory_conf = (shm_conf*)mmap(NULL, shm_size , PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
        printf("%s\n", strerror(errno));
        return 0;
    }

memory_conf->process_count = count;
memory_conf->memory_size = shm_size;

int process_numbers[memory_conf->process_count][2];

for(int i = 0; i < memory_conf->process_count; i++) {
        process_numbers[i][0] = 0;
        process_numbers[i][1] = i;
    }

memcpy(memory_conf + sizeof(shm_conf), process_numbers, sizeof(process_numbers));

我想在 shm_conf 结构之后存储一个二维数组。但是 memcpy 给了我一个段错误,我不知道为什么,你能帮助我吗?

在这个数组之后我想存储另一个数组,这就是为什么 shm_size 比我当前需要的大。

最佳答案

错误可能是 memcpy 调用中的指针算术。

memcpy(memory_conf + sizeof(shm_conf), process_numbers, sizeof(process_numbers));

memory_conf 已经是一个 shm_conf 指针,因此它会增加 sizeof(shm_conf)。该行应更改为:

memcpy(memory_conf + 1, process_numbers, sizeof(process_numbers));

避免复制到未分配的内存中

关于c - 为什么共享内存中的 memcpy 会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156500/

相关文章:

java - 包中包含 .java 文件的 Eclipse JNI

python - 解压以 ASCIIZ 字符串结尾的结构

c++ - 使用指针时的核心转储

c++ - 交换宏的值

c - 如何为返回 int* 的 C 函数生成 R 包装器?

c - C中的评估&&运算符

c - qsort 结构数组降序

c++ - 我可以将 std::atomic<int64> 放置在共享内存中并期望原子操作吗?

内存中的python多处理共享文件

c++ - 如何解决 boost 错误: terminate called after throwing an instance of 'boost::interprocess::interprocess_exception'