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 回答