質問
C ++のConst Pointersと混同し、小さなアプリケーションを書いて、出力が何であるかを確認します。私は正しく機能してはいけませんが、私が正しく実行されるべきではなく、私が正しく実行されたときに、私が "hello world"を正しく実行しているとき、私は試みています(私は信じています)。誰かがこの行(S += S2)がどのように機能しているのかを理解するのを助けますか?
マイコード:
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
const char* append(const char* s1, const char* s2){
std::string s(s1); //this will copy the characters in s1
s += s2; //add s and s2, store the result in s (shouldn't work?)
return s.c_str(); //return result to be printed
}
int main() {
const char* total = append("hello", "world");
printf("%s", total);
return 0;
}
. 解決
変数s
は、append
関数内のローカルです。append
関数がその変数を返したら、存在しなくなった文字列へのポインタを残します。このポインタを使用すると、 未定義の動作 。
私のヒントこの解決方法について: std::string
すべて方法!
他のヒント
const char*
にstd::string
を追加していて、可能です(これ参照)。char*
タイプ(Cスタイル文字列)でその操作をすることは不可能ではありません。
ただし、ローカル変数へのポインタを返しているため、関数append
がスタックを返し、返されたポインタが指している文字列は存在しません。これは未定義の行動につながります。
クラスSTD :: Stringは、operator +=
型のオペランドのオーバーロードされたconst char *
basic_string& operator+=(const charT* s);
.
実際には、このポインタが指す文字列をSTD :: Stringのオブジェクトの内容に追加して、必要に応じて追加のメモリを割り当てます。たとえば、内部的にオーバーロードされたオペレータは標準のC関数strcat
を使用できます。
概念的には次のコードスニペットと似ています。
char s[12] = "Hello ";
const char *s2 = "World";
std::strcat( s, s2 );
.
Function function functionを終了した後にローカルオブジェクトを破棄した後にtotal
が無効になるため、プログラムが未定義の動作をしていることを考慮に入れる。だからメイン
printf("%s", total);
.
は未定義の行動をもたらす可能性があります。