關於PChar和指標

來源:互聯網
上載者:User

  對於剛開始學編程的人來說,指標無疑是最大的恐懼和進步障礙了. 我本人也是如此,居然畢業1年後還是見到^就怕的要命.其實現在想來,其實指標變不是什麼難的東西,而且靈活運用它能有帶來許多便利,很多人把指標比喻成門牌號碼,這個比喻是再恰當不過了,一個門牌號碼你當然看不到,這個門牌所對應的具體的是哪個房子哪棟樓是什麼樣的吧,指標也一樣,在win32裡它也只是一個佔4個位元組(32位)的數字,而這個數字對應的記憶體具體所儲存的是什麼東西,你不去訪問它是不知道的.

  很多人在寫要提供其他語言調用的dll的時候,知道要用pchar來做為字串,我就以pchar來做一些簡單的介紹吧.

首先我們來看一下pchar的定義:在隨便哪個事件裡定義一個P:PChar將滑鼠放到PChar上,可以看到type System.PChar=^Char可以看到PChar就是一個指向Char類型的指標,另外PAnsiChar類型的也可以看到type System.PAnsiChar:PChar 所以你應該以後不會問PAnsiChar和PChar有什麼不同了吧.

既然是指標,如果要使用就要給它分配記憶體,或者將它指向一個已經分配了的記憶體.我們先來看給PChar分配記憶體的函數,delphi提供了一個叫StrAlloc的函數來給null-terminated string類型的字串分配記憶體,該函數可以用來給PChar分配size(參數)位元組的記憶體,並將PChar指向第一個字元.知道它的作用,我們再來看下它的原始碼(按住Ctrl點函數):

function StrAlloc(Size: Cardinal): PChar;
begin
  Inc(Size, SizeOf(Cardinal));
  GetMem(Result, Size);
  Cardinal(Pointer(Result)^) := Size;
  Inc(Result, SizeOf(Cardinal));
end;

一句來解釋下,Inc(Size, SizeOf(Cardinal));將要分配的記憶體加上一個Cardinal的長度,為什麼後面再說

GetMem(Result, Size);分配size長度的記憶體,並將Result指向這塊記憶體開頭,注意GetMem分配的都是堆記憶體.

Cardinal(Pointer(Result)^) := Size;將Result指向的記憶體的前4個位元組填上Size的大小.

Inc(Result, SizeOf(Cardinal));將Result的指加4,也就是將Result往後指了4個位元組
現在可以看出來了吧,StrAlloc分配記憶體時會用4個位元組來儲存函數申請的記憶體的大小.對應的釋放的函數StrDispose函數這裡就不說了.所以如果要得到一個PChar的申請的緩衝的大小隻要看這4個位元組就知道了.其實只要取到這4個位元組儲存的資料-去4就是了,但其實delphi裡提供了StrBufSize函數可以擷取,方法就是這樣的,大家可以注意到它另外申請了個PChar變數,大家可以自己想想如果不用這個變數的話程式該怎麼改,還有函數的定義該怎麼改.

來看這樣一段程式:

var
  P:PChar;
  S:String;
begin
  S:='aaaa';
  try
    P:=StrAlloc(1024);
    //P:=StrPCopy(P,S);
    P:=PChar(S);
    Showmessage(P);
    Showmessage(InttoStr(Length(P)));
  finally
    StrDispose(P);
  end;
end;

以上代碼運行會發現StrDispose(P);這句會報Invalid pointer operation,非法的指標操作,為什麼呢?

因為P:=PChar(S);這句已經將P指向一個局部變數的記憶體,而它的分配和釋放是由delphi編譯器來管理的,你無法操作的,而你原來申請的1024個位元組的記憶體已經泄露了.所以指標操作裡千萬不要再建立記憶體後又重新指向另外一個地方.前2天有個人問我,2個PChar的字元能不能串連直接用+來,也許你該想想,2個門牌號碼的數字加起來是不是就是代表這2個房間呢? 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.