2011-01-21 38 views
0

所以,我有2段代碼,其中一段可用,另一段不可用。第一部分只是一個測試,以確定在從本地分配返回後,char指針是否仍然有效。出於某種原因,這個工程:什麼決定回收本地分配?

char* test(){ 
     char* rawr="what"; 
     return rawr; 
    } 

但是這一次不工作:

char* folderfromfile(char* filz) //gets the folder path from the file path 
    { 
      //declarations 
      int lastslash=-1; 
      int i  =0; 
      char rett[256]; 

     for(i;(int)filz[i]!=0;i++) 
       if(filz[i]=='\\') 
        lastslash=i;  //records the last known backslash 

     if(lastslash==-1) 
       return "";   //didn't find a backslash 

     for(i=0;i<=lastslash;i++) 
       rett[i]=filz[i];  // copies to new string 

     rett[i] =0; //end of string 
     cout << &rett << "====" << rett << endl; 

     system("pause>nul");//pause so i can watch over the memory before it deallocates 
     return rett; 
    } 

我敢打賭,有一個更好的方式來完成從完整路徑刪除文件名的這個任務,但現在我只是想弄清楚爲什麼這個字符指針被刪除,而另一個不是。如果我不得不猜測我會說,因爲我以不同的方式宣佈它,或者因爲它更大。是的,我可以傳遞另一個字符指針作爲這個函數的參數,但那不會回答我的問題。

+3

第一個*恰好工作*是因爲編譯器在堆棧外發生了什麼。使用非常量字符串,或者也許只是改變編譯器,體系結構或編譯器標誌,可能會改變這一點。甚至不要考慮寫這種破碎的代碼。 – delnan 2011-01-21 17:10:16

回答

0
char* test(){ 
    char* rawr="what"; 
    return rawr; 
} 

的字符串文字"what"在棧上分配的 - 它仍然是整個程序的壽命有效。但是它不能被修改。指針rawr本身位於堆棧上,但如果您編寫諸如&rawr之類的東西,就會得到一個指針指針,這只是一個問題。

char* folderfromfile(char* filz){ //gets the folder path from the file path 
    int lastslash=-1,i=0;char rett[256]; //declarations 
    ///// ... 
    return rett; 
} 

然而,這提出一個陣列堆棧上。 rett這裏隱含的是&rett[0],也就是說,獲取一個指向數組的第一個元素的指針,這個元素非常多,並且在返回後無效。

5

rett被分配到棧上,所以當方法返回時它的內存空間不再有效。

rawr指向程序運行時編譯器可能保留在(只讀)內存中的文字。

兩種方法都是錯誤的。

您需要使用new(或malloc in C)分配緩衝區或使用std :: string。