1

重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?

#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 などの好きな const を印刷するとうまくいきますが、*b+i のようなループで const を int に置き換えるとうまくいきません!!

PS これはハードウェアではありません!! 私は長年のプログラマーでした。これらすべてを忘れてしまったことを恥じます。

何か案は?

4

4 に答える 4

1

関数内で宣言された変数は、自動保存期間オブジェクトであり、関数の最後でスコープ外になります (したがって、有効ではなくなります)。関数よりも長く存続するストレージを割り当てるには、動的ストレージ期間オブジェクトが必要です (これらは new を介して割り当てられます)。

char *b = new char[11];
于 2012-11-03T16:28:31.737 に答える
1

エラーが表示される理由は、ローカル変数へのポインタを返してはいけません。

ローカル変数はスタックに割り当てられます。変数がスコープ外になると、メモリの割り当てが解除されます。

今、スコープ外になったために割り当て解除された変数にアクセスしようとしています(したがって、スタックから削除されました)

また

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

b と i の両方がインクリメントされるのはなぜですか?

ベースポインタアドレス(b)ではなく、iだけをインクリメントする必要があります

要約すると、これはあなたが使用すべきプログラムです

#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;
             }
于 2012-11-03T16:29:54.550 に答える
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;
}

ローカル変数を返すのではなく、文字列を逆にした元の配列を返します。

于 2012-11-03T16:49:13.587 に答える
0

大事なことを言い忘れましたが、あなたが望むようにではなく、によってレイズされた(つまり)によって指さ*b+iれたオブジェクトの値を意味します。bi(*b)+i*(b+i)

于 2012-11-03T16:33:26.310 に答える