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