如何从共享内存中分离字符串数组? 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的主要内容,如果未能解决你的问题,请参考以下文章
如何从输入字符串中分离整数并将它们转换为 int 类型以允许对它们进行计算