2011-01-21 1 views
0

私は2つのコードを持っています。一つは動作し、もう一つは動作しません。最初の部分は、charポインタがローカル割り当てから返された後でも有効であるかどうかを調べるテストに過ぎませんでした。返却時にローカル割り当てを割り当て解除することを決めるのは何ですか?

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

をしかし、この1つは動作しません::この作品何らかの理由で

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; 
    } 

私は完全なパスからファイル名を削除するこのタスクを達成するためのより良い方法があることを賭けたが、今のところ、私はちょうどなぜこのcharポインタが他のものが削除されているのか把握しようとしています。もし私が推測しなければならないのは、私がそれを違うと宣言したか、その大きさのためだと言うだろう。はい、私はこの関数の引数として別のcharポインタを渡すことができますが、それは私の質問に答えることはできません。

+3

コンパイラによって '' what ''がスタックの外側に配置されるため、最初は*動作します。定数でない文字列を使うか、あるいは単にコンパイラ、アーキテクチャ、コンパイラのフラグを変更すると、それを変更することができます。そのような壊れたコードを書くことさえ考えないでください。 – delnan

+1

関連しないメモでは、実際には1行に1つのステートメントを書く必要があります。だけでなく、それは大幅に読みやすさを向上させるだけでなく、特にブレークポイントになると、デバッグをはるかに簡単になります。 –

+0

これは私が見た中で最も醜いコードのいくつかでした。空白はあなたの友人です。コードを読むのが簡単であれば、人々はあなたを助けてくれるでしょう。 –

答えて

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は、プログラムの実行時にコンパイラが(読み取り専用の)メモリに予約する可能性のあるリテラルを指します。

どちらの方法も間違っています。

新しい(またはCのmallocを使用して)バッファを割り当てるか、std :: stringを使用する必要があります。

関連する問題