为什么这段代码不能打印“20”?

时间:2016-08-03 09:09:22

标签: c memory-management stack malloc heap

void fun(int* x){
    x=(int*)malloc(sizeof(int));
    *x = 20;
}

int main(){
    int y=31;
    fun(&y);
    printf(%d,y);
}

为什么这段代码能够成功编译?

评论:它是在Eclipse上编译的 我在网上看到了问题:    X =(INT *)malloc的(的sizeof(int)的);

为什么这个程序没有在运行时崩溃?

4 个答案:

答案 0 :(得分:6)

语法代码没有任何问题,因此编译。

y的地址传递给该函数。保存地址x的函数中的指针y被malloc分配的有效内存地址覆盖。当指针的值发生变化时,会在那里写入一个int而不是y。然后函数返回(fun中分配的内存“泄漏”)。

主要y的值保持不变。

定义了该程序的行为。

答案 1 :(得分:3)

嘿,你传递的是变量y的地址副本,它被推送到堆栈上。您只需通过指定malloc返回的地址并通过

将值20复制到该地址来操纵指针(在指针被推动的位置)
*x = 20

main中的变量没有影响,即y

如果您想要打印20,这可能会有所帮助

void fun(int** x){
    *x=(int*)malloc(sizeof(int));
    **x = 20;
}

int main(){
    int *y;
    fun(&y);
    printf("%d",*y);
}

答案 2 :(得分:1)

x=(int*)malloc(sizeof(int));  //x point to a new addr.

*x = 20;  // change value of new pointer 

删除行x=(int*)malloc(sizeof(int));,然后就可以了。

答案 3 :(得分:0)

我想您想要做的是更改y函数中变量main的地址。你不能通过将y的地址值传递给函数来做到这一点。因为y的地址根本没有分配操作。在您的示例中,y的地址没有变量(基本上是指针)(忘了分配)。

    int* fun(int* x){
        printf("Fun before %p - %d\n", x, *x);
        x = malloc(sizeof(int));
        *x = 20;
        printf("Fun after %p - %d\n", x, *x);
        return x;  // return your new address
   }

   int main(){
       int *y = malloc(sizeof(int));
       *y = 31;
       printf("Main before %p - %d\n", y, *y);
       y = fun(y);  // assign your new address here
       printf("Main after %p - %d\n", y, *y);
       return 0;
   }

但上面的代码可以。