2012-11-03 126 views
1

可能重複:
Can a local variable’s memory be accessed outside its scope?值指針是垃圾返回時

#include <iostream> 
#include <string> 

using namespace std; 

char* reverse(char* input) 
{ 
    char b[11]; 

    for (int i=0; i<11; i++) {b[10-i]=input[i];} 
    for (int u=0; u<11; u++) {cout<<b[u];} 
    cout<<endl; 
    return &b[0]; 
} 

int main() 
{ 
    char ali[]="ali is good"; 
    char *a=&ali[0]; 
    char *b=reverse(a); 

    for (int i=0; i<11; b++, i++) 
     { 
      cout<<*b+i<<endl; 
     } 
    cout<<endl; 
    system("pause"); 
    return 0; 
} 

這是一個簡單的程序,以扭轉一個字符串,它工作得很好,當你打印出結果該函數,但是當將字符串的指針傳遞給Main然後打印它時,它會打印出類似垃圾的東西。

爲什麼這很奇怪?因爲如果我打印* b + 2或* b + 5或任何常量我喜歡,它運作良好,但如果我用* b +我循環中的int替換爲const,然後它不起作用!

P.S.這不是硬件!我「是」一位長期的程序員,因爲忘記了這一切而感到羞恥。

任何想法?

+4

您正在返回一個指向局部變量的指針。函數返回後不再存在。 –

+0

http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/6445794#6445794 –

+0

謝謝先生,我已經解決了它,因爲Mihail Burduja指出下面。 – ali8

回答

1

在函數內部聲明的變量是自動存儲持續時間對象,並在函數結束時返回範圍(因此不再有效)。分配存儲是生活不是函數不再需要動態存儲時間的對象(這些都是通過新的分配):

char *b = new char[11]; 
+0

是「Mihail Burduja」,解決了它! 也有一些「錯字」像增加b和我,而我應該只增加b,但這是無關緊要的。 – ali8

+0

因爲忘記所有這些基本主題而感到羞恥!感謝大家。 – ali8

1

你應該指針永遠不會返回到一個局部變量,那爲什麼你看到的錯誤。

本地變量分配在堆棧上。 當變量超出範圍時,內存將被解除分配。

現在,您試圖訪問爲什麼遞增已解除分配,因爲它已超出範圍(因此刪除從堆棧)可變

而且

for (int i=0; i<11; b++, i++) 
         { 
          cout<<*(b+i)<<endl; 
         } 

b和一世?

你應該增加只是我和不是基本指針地址(B)

總之這是你應該使用程序

#include<iostream> 
    using namespace std; 

      void reverse(char* input,char * output) 
      { 


       for (int i=0; i<11; i++) {output[10-i]=input[i];} 
       for (int u=0; u<11; u++) {cout<<output[u];} 
       cout<<endl; 

      } 

      int main() 
      { 
       char ali[]="ali is good"; 
       char *a=&ali[0]; 
       char *b=(char *)malloc(sizeof(ali)); 
       reverse(a,b); 

       for (int i=0; i<11; i++) 
        { 
         cout<<*(b+i)<<endl; 
        } 
       cout<<endl; 
       system("pause"); 
       return 0; 
      } 
+0

是的,這是正確的,謝謝。 – ali8

0

最後但並非最不重要的,*b+i指的價值對象由b指向i(即(*b)+i),而不是*(b+i)如您所願。

+0

這也是正確的。非常感謝 – ali8

0

試試這個,而不是

char* reverse(char* input) 
{ 
    int len = strlen(input); 
    for (int i=0; i<len/2; ++i) 
    { 
    char tmp = input[i]; 
    input[i] = input[len-i-1]; 
    input[len-i-1] = tmp; 
    } 
    return input; 
} 

則不必返回一個局部變量,但返回原始數組在顛倒字符串。