4

より複雑なプログラムを作成しましたが、問題を次のプログラムに絞り込みました。このプログラムがhzlloではなくジャンクを印刷するのはなぜですか。デバッガーでtempとpの値とメモリアドレスを追跡しましたが、foo関数から正しく返されます。そのため、印刷ジャンクがわかりません。

void foo(char **str) {
    char temp[79];
    strcpy_s(temp,79,*str);
    *(temp + 1) = 'z';

    *str = temp;    

}

void main() {

    char *p = (char*) malloc(79 * sizeof(char));
    p = "hello";
    foo(&p);

    printf("%s", p);
}
4

3 に答える 3

4

tempはローカル変数であり、終了するとスコープ外になりますfoo。したがってp、ダングリングポインタであり、プログラムの動作は未定義です。

于 2013-01-15T23:56:36.063 に答える
4

変化する

char temp[79];        # allocated on the stack, vanishes on return

...に...

static char temp[79]; # has a longer lifetime

また、は必要ありませんmalloc(3)

于 2013-01-15T23:58:57.837 に答える
1
void foo(char **str) {
    // Bad: "temp" doesn't exist when the function returns
    char temp[79];
    strcpy_s(temp,79,*str);
    *(temp + 1) = 'z';

    *str = temp;    

}

void main() {

    char *p = (char*) malloc(79 * sizeof(char));
    p = "hello";
    foo(&p);

    printf("%s", p);
}

これの方が良い:

void foo(char **str) {
    // This should change the pointer ... to something valid outside the function
    *str = (*str) + 1;        
}
于 2013-01-16T00:00:33.913 に答える