2

我有点困惑,在这个示例代码中说;

ptrMem = createSharedMemory();  

ptrTemp = ptrMem;

ptrMem指向由创建的共享内存位置SHMGET

指向它有什么意义,ptrTemp我如何利用两者?

我想遍历内存并分配随机数,例如;

ptrTemp = ptrMem;       
for(nCount = 0; nCount < 24; nCount++)
        {   
            x = rand() % 10000;
            *ptrTemp++ = x;
        }   

这种情况是有一个客户端和一个服务器通过共享内存进行通信。需要有一个字符或类似的东西向其他进程表明他们可以进行处理。例如,在上述循环完成后;*ptrMem='*'.

4

4 回答 4

2

这是因为在循环中您更改了指针ptrTemp。做完后ptrTemp++指针不再指向原来的内存。

于 2013-04-11T15:14:23.220 回答
1
  • 让 ptrTemp 也指向它有什么意义,我如何利用两者?

这与链表中的“头”指针相同。

ptrTemp = ptrMem;     // here both pointers point to the start
                      //  of your shared memory location

当你运行你的循环时,你一次又一次地执行这个:

*ptrTemp++ = x;

现在ptrTemp不再指向共享内存位置的开始。在这个特定的例子中,你知道你循环了 24 次(你的指针增加了 24 次),所以你可以使用指针算术并“回退”地址,但为什么要麻烦呢?对于一些额外的字节,您可以只使用一个新指针,并且始终可以方便地引用缓冲区的开头,这很可能需要传递/引用。

请记住,名称ptrTemp中包含“Temp”,这意味着它用于某种临时存储。


编辑:操作*员要取消引用一个指针(或这样声明)。所以在你的代码中:

ptrTemp = ptrMem; // Assigning one pointer to another, no need for the * here since
                  // they are both pointers.

*ptrTemp++ = x; // here you are assigning a value to the memory pointed to by ptrTemp
                // to assign a value you need to dereference, then we increment ptrTemp
  • 如果我想打印内存,我必须这样做;ptrTemp = ptrMem,对吧?

不是真的,那只会将临时指针设置回共享内存缓冲区的开头。如果您想打印内存的内容,您可以简单地执行以下操作:

for(nCount = 0; nCount < 24; nCount++)
    printf("%p: %d\n", ptrMem+nCount, *(ptrMem+nCount));

这不会改变 ptrMem 所指出的内容(因为我们从不覆盖它)我们想知道哪个内存地址 (ptrMem+nCount) 具有什么值(它的取消引用版本)所以我们打印一个"%p"(指针格式字符串)和一个"%d"(int 格式字符串)

于 2013-04-11T15:19:18.637 回答
0

这是一个品味问题。

如果您想通过增加一个指针来遍历内存,那么您需要保留一个指向开头的指针,以便可以正确释放它。

您也可以使用索引来遍历内存,而不是使用临时指针。

for(nCount = 0; nCount < 24; nCount++)
{   
    x = rand() % 10000;
    ptrMem[nCount] = x;
} 

在使用指针迭代内存缓冲区而不是仅使用索引时,我见过(或自己做过)的大多数情况是指针前进的量不一致。例如,如果您的缓冲区在每个元素中始终具有相同的数据类型,则编译器可以知道要为您增加多少指针(或计算索引偏移量)。

struct mystruct* ptrMem;
ptrMem[0]; // first element
ptrMem[1]; // second element

struct mystruct* ptrTemp = ptrMem;
*ptrTemp; // first element
ptrTemp++; // increments ptrTemp by sizeof(struct mystruct) bytes
*ptrTemp; // second element

在这种情况下,您希望使用哪一个是个人喜好问题。

例如,如果编译器无法知道缓冲区中包含的数据的结构,例如处理命令具有可变长度的 midi 文件,则一次迭代一个字节的指针会更容易(更具可读性)。尽管如此,编译器仍然知道字节的大小,因此您也可以在此处使用索引。

于 2013-04-11T15:17:00.427 回答
0

prtTemp如果我需要更改他的值来访问共享内存的不同内存区域,我会使用。

如果我需要指向共享内存区域的第一个字节,我可以使用 untouchedptrMem

于 2013-04-11T15:14:27.867 回答