如何从共享内存中分离字符串数组? C

Posted

技术标签:

【中文标题】如何从共享内存中分离字符串数组? C【英文标题】:How do you detach an array of strings from shared memory? C 【发布时间】:2012-11-09 04:35:20 【问题描述】:

我有:

int array_id;
char* records[10];

// get the shared segment
if ((array_id = shmget(IPC_PRIVATE, 1, 0666)) == -1) 
            perror("Array Creating");


// attach
records[0] = (char*) shmat(array_id, (void*)0, 0);
if ((int) *records == -1) 
     perror("Array Attachment");

效果很好,但是当我尝试分离时,我得到一个“无效参数”错误。

// detach
int error;
if( (error = shmdt((void*) records[0])) == -1) 
      perror(array detachment);   

有什么想法吗?谢谢

【问题讨论】:

你怎么知道shmat 工作“很好”?您没有进行错误检查...并且 array_id 未初始化使用。 从不发布修改和不完整的代码,总是发布我们可以编译的完整和实际代码! @Jens 是的,他做到了,他正在检查错误是 = -1。我对 perror(array detachment) 部分感到困惑,这实际上是 c 中的东西吗? 对不起,我把错误检查出来了,但我在附加后确实检查了。我知道它工作得很好,因为我没有收到任何错误,我还分配了一些字符串并将它们打印出来。我被告知使用 perror() 而不是 printf() O.o @Ben 不,他没有。我说的是附加,而不是分离。在附加失败时分离并不奇怪。 @Tim 除非您提供我们可以编译的完整、自包含的程序,否则这是无法诊断的。到目前为止,我们只有“医生,当我做某事时很痛”。 :-) 【参考方案1】:

shmdt()中,不需要将指针参数转换为void*,它会自动处理这个。

shmdt((void*) records[0])) 中删除(void*)。应该是这样的。

if ((error = shmdt(records[0]) ) == -1)

  perror("Array detachment");

它会起作用的。

同样在 shmat() 中,出错时返回 (void*) -1,因此您的比较会发出警告。 就这样吧

if ((char *)records[0] == (void *)-1)

  perror("Array Attachment");

【讨论】:

在测试==(void*)-1)时不需要转换records[0] @alk :我看到了shmat 的手册页,其中给出了(void*) -1..这就是我写的原因。您能否在这里为我详细说明一下,因为与整数指针的比较会给您带来警告,不是吗? records[0] 是一个指针(char *)。任何指针都可以分配和比较到void* 而无需强制转换。这种将-1 转换为void* 的方法只是让shmat() 能够返回一些错误。【参考方案2】:

假设附加顺利,invalid argument 仅仅意味着段已经被分离,或者records[0] 的值在附加设置后发生了变化。

【讨论】:

我的回答暗示问题不在于您如何附加/分离。代码基本没问题。如果您想完善它,请选择 Omkant 的 答案。 @蒂姆 你是对的,我没有修改记录[0],错误就消失了。 @alk

以上是关于如何从共享内存中分离字符串数组? C的主要内容,如果未能解决你的问题,请参考以下文章

从一个数组元素中分离两个字符串

如何将字符串数组附加到共享内存? C

如何从输入字符串中分离整数并将它们转换为 int 类型以允许对它们进行计算

如何从数组列表中分离数据并将其显示到列表视图中?

typescript Javascript创建从数组中分离的逗号

在c中分配空间并连接到无符号字符数组