2010-07-15 57 views
3

這裏是我的代碼部分:副本的char *爲char *

extern "C" REGISTRATION_API int extreme(char* lKey) 
{ 
string s1; 
char *p=NULL; 
try 
{ 
    ifstream myfile ("extreme.txt"); 
    int i=0; 
    if (myfile.is_open()) 
    { 
    while (getline(myfile,s1)) 
     { 
     switch (i) 
     { 
     case 1: 
     strcpy(p,s1.c_str()); 
     lKey=p; 
     break; 
      //continue here 
     } 
     } 
    } 
} 

現在,當我打電話從外部應用這個功能,我得到這個錯誤:

AccessViolationException:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

的問題是由於這樣的:

lKey=p; 

我如何分配給lKeyp

+0

你在哪裏分配內存到指針p? – 2010-07-15 14:29:05

回答

8

你需要預先分配,你傳遞給strcpy內存。即一個p = new char[s1.length()+1];將做到這一點(+1爲終止0字符)。但是,將std::string和C字符串例程混合使用並不是一個好主意。更好地堅持與std::string,它會爲您節省大量的麻煩。

此外lKey=p也不會工作 - 它只是將本地地址p複製到本地變量lKey。來電者甚至不會看到區別。

+0

如果我想對p執行一些修改然後將其分配給lkey,該怎麼辦? 讓我們說: 我打電話給methodone(p); 然後我想把結果分配給lkey,我該怎麼做? – Zee99 2010-07-16 06:56:46

+0

嗨亞歷山大,我面臨着類似的問題,我發現你的答案有用。我有一個小問題:請你詳細說明你的第二段?需要什麼而不是lKey = p,以便調用者能夠正確接收lkey中的新值?歡呼 – ibiza 2011-11-15 17:52:35

+0

@ibiza:lKey需要是一個調用者分配的緩衝區,那麼你可以用'strcpy'來調用它。不過,請注意不要超出緩衝區的末端。或者,也可以使用'char **'並使函數'malloc'成爲一個足夠容納字符串的緩衝區。 – 2011-11-15 18:10:00

10

實際上問題是strcpy(p,s1.c_str());,因爲p從不會設置爲NULL而不是NULL。

+0

@ Zee99 strcpy只是複製數據。 p是指向未分配內存的指針。因此,當你複製你只是複製到內存位置0,這是非法的。 – 2010-07-15 14:32:16

7

請記住,char*只是一個內存位置的地址。你需要在地址分配內存。

在你的代碼中,你沒有分配內存來使用,你沒有設置p來指向那個內存地址。

strcpy不分配緩衝區,只需要一個內存地址將數據複製到。

如果你傳遞一個緩衝區中的功能,那麼你可能要簡單,就是(和刪除P)

strcpy(lKey, s1.c_str()); 
1
  1. 消除P(它是在這裏什麼都不做),並從複製數據S1直接LKEY
  2. 不打你,但是縮進計劃是很滑稽,請警察良好的作風從某處(谷歌1tbs)