2013-04-11 81 views
2

我有点困惑,说在这个例子中的代码;C - 指针和内存

ptrMem = createSharedMemory(); 

ptrTemp = ptrMem; 

ptrMem点到共享内存位置SHMGET

什么是在具有ptrTemp指向它还有点,如何利用两个产生的?

我想通过存储回路和分配的随机数,例如;

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

这种情况是有一个客户端和服务器通过共享内存进行通信。需要有一个角色或类似的东西来指示另一个进程他们可以进行处理。例如,上述循环完成后, *ptrMem='*'

+0

你用来处理分配的内存,其他的你保留记住以后可以免费使用的内存(ptrMem + nCount)具有什么值(解除引用的版本)你的代码。 – 2013-04-11 15:08:36

+1

取决于代码的其余部分,例如你可以增加一个来通过内存 – Mark 2013-04-11 15:09:00

+2

有很多原因可以做到这一点。你可以添加更多信息吗? – 2013-04-11 15:09:22

回答

2

这是因为在循环中你改变指针ptrTemp。在做了ptrTemp++之后,指针不再指向原始内存。

0

我会用prtTemp如果我需要改变自己的值来访问共享内存的不同存储区。

万一我需要指向共享内存区域的第一个字节,我可以使用非触摸ptrMem

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文件,则可以更容易(更可读)迭代指针一个字节一次。不过,编译器知道一个字节的大小,所以你也可以在这里使用索引。

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,对吗?

不是真的,那只是将temp指针设置回共享内存缓冲区的开始位置。如果你想打印内容内存出来,你可以简单地做:

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

这不会改变什么ptrMem指向了(因为我们从来没有覆盖它),我们想知道的内存地址(我们打印一个"%p"(指针格式字符串)和一个"%d"(int格式字符串)

+0

好吧,我现在明白了!你介意为我解释一个更详细的信息吗?在循环之前,我在循环中执行'ptrTemp = ptrMem'(不加星号); '* ptrTemp ++'(注意星号)然后,如果我想打印出来的内存,我必须做; 'ptrTemp = ptrMem',对吗?但为什么这里不需要星号? – 2013-04-11 15:22:57

+0

@TomSothcott - 编辑是否有助于澄清您的其他问题? – Mike 2013-04-11 15:31:06

+0

是@Mike它,谢谢! :) – 2013-04-11 15:57:37