0

つまり、なぜ次のように動作するのですか:

    char* char_array(size_t size){
            return new char[size];
    }

    int main(){
            const char* foo = "foo";
            size_t len = strlen(foo);
            char* bar=char_array(len);
            memset(bar, 0, len+1);
    }

しかし、次のセグメンテーション違反:

    void char_array(char* out, size_t size){
            out= new char[size];
    }

    int main(){
            const char* foo = "foo";
            size_t len = strlen(foo);
            char* bar;
            char_array(bar, len);
            memset(bar, 0, len+1);
    }
4

3 に答える 3

2

'bar' を char_array に渡すと、呼び出し時にそのポインターの現在の値のコピーが渡されます。新しく割り当てられた値が単に失われることを返します。

「バー」変数を実際に変更したい場合は、バー変数自体へのポインターまたは参照を渡す必要があります。

void char_array(char** out, size_t size) {
    *out = new char[size];
}

...
char_array(&bar, len);

また

void char_array(char*& out, size_t size) {
    out = new char[size];
}

...
char_array(bar, len);
...
于 2012-06-10T22:37:19.320 に答える
1

を変更outしていないため、ポインタを参照渡しする必要があります。

void char_array(char*& out, size_t size)
//                   |
//           pass by reference

memset現在、初期化されていないポインターを呼び出しています。

于 2012-06-10T22:32:34.143 に答える
1
 0 void char_array(char* out, size_t size)
 1 {
 2    out = new char[size];
 3 }

 5 int main()
 6 {
 7    const char* foo = "foo";
 8    size_t len = strlen(foo);
 9    char* bar;
10    char_array(bar, len);
11    memset(bar, 0, len+1);
12 }

char* bar9行目は初期化されていないため、どこでも指すことができるポインター変数を宣言しています。10 行目で char_array を呼び出し、そのガベージ ポインター値をoutパラメーターにコピーします。コピーされるのは bar 内のガベージ値であることに注意してください -out値を取得しますが、 への固有の接続はありませんbar。このガベージ値は使用されませんnew。2 行目で返されたポインターで上書きされ、関数が戻るときに破棄されます。

char_arrayそれ自体を変更できるようにbarするには、ポインターへの参照を使用します。

void char_array(char*& out, size_t size) { out = new ... }

...またはポインタへのポインタ...

void char_array(char** p_out, size_t size) { *p_out = new ... }

char_array(&bar, len);

どちらの方法でも、それを変更するchar_array場所を知っています。bar

于 2012-06-10T22:42:31.187 に答える