質問

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);
.

は未定義の行動をもたらす可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top