【问题标题】:shm_memory + mmap + table + structshm_memory + mmap + 表 + 结构
【发布时间】:2016-09-11 12:10:54
【问题描述】:

我正在尝试访问由 shm_open 创建的共享内存区域中的一个表,其中包含一个包含void ** table 的结构。 由于各种malloc,我已经对其进行了初始化 但是当我尝试访问它时,我遇到了分段错误。 我猜这是因为 memcpy 指令,但我不知道为什么。请问有人可以帮我吗?

它有错误的部分。

if(channel->index > 0){
    if(DEBUG){
        printf("channel_recv : channel->index > 0 (%d) \n",channel->index);
    }
    if(memcpy(data,channel->tampon[0],channel->eltsize)==NULL){
        return -1;
    }
    printf("apres memcpy \n");
    defile(channel);
    return 1;
}

还有初始化。

channel = (struct channel *)malloc(sizeof(struct channel));
channel->tampon = malloc(size * sizeof(void *));
for(i = 0 ; i < size;i++){
    channel->tampon[i] = malloc(eltsize * sizeof(void));
}

“defile”函数将其中的每个元素向左移动。

【问题讨论】:

  • 你在某处也将channel-&gt;eltsize 设置为非零值吗?
  • 是的 channel->eltsize 和 channel->size 给定了,我测试它们是否不是 0 或负数。实际上它的错误部分涉及 memcpy,尤其是 channel->tampon 超时我试图访问它我有一个分段错误
  • 这段代码看起来有点可疑...您可能想要包含更多上下文,例如通道结构定义。还有你打算用 sizeof(void) 分配多少内存?
  • 在共享内存区域中存储指针值是没有意义的。这些值在编写它们的程序之外没有任何意义。附加和使用共享内存的其他进程将在这些地址具有不同的对象。 (或根本没有)

标签: c struct void


【解决方案1】:

你的初始化

    channel->tampon[i] = malloc(eltsize * sizeof(void));

错了。

ISO/IEC 9899:201x

void 类型包含一组空值;这是一个不完整的 无法完成的对象类型。

sizeof 运算符不应应用于具有 函数类型或不完整类型,到括号中的此类名称 一种类型,……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多