2013-04-11 114 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