2016-08-03 152 views
1
void fun(int* x){ 
    x=(int*)malloc(sizeof(int)); 
    *x = 20; 
} 

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

为什么这段代码能够成功编译?我在线看到问题: x =(int *)malloc(sizeof(int));为什么此代码不打印“20”?

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

+6

因为C给你足够的绳索来吊死你自己。 – Idos

+1

删除'x =(int *)malloc(sizeof(int));','%d' - >''%d \ n“' – BLUEPIXY

+1

不要将malloc的结果强制转换为C,并使用sizeof * x)而不是sizeof(int)。 – Caw

回答

6

语法上的代码没有问题,所以它编译。

将地址y传递给该函数。保存地址为y的函数中的指针x被malloc分配的有效内存地址覆盖。随着指针的值发生更改,写入int时不会写入y。然后函数返回(fun中分配的内存确实'泄漏')。

y在主要的价值保持不变。

该程序的行为已定义。

+0

@ user3781974您的问题中的代码中有几个拼写错误。请修复它们。 – 2501

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

你给的例子是错误的,因为内存被分配给'main'中'y'和'y' remians _uninitialized_的副本。所以基本上它有** _未定义的行为_ **。 – ameyCU

+0

@ameyCU谢谢 –

+0

为什么你会使用双重间接?为什么不'void fun(int * x){* x = 20; }'并且传递'int y;有趣的(&y);'in main? –

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

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

删除该行x=(int*)malloc(sizeof(int));,那么它会工作。

0

我想你想要做的是改变main函数中变量y的地址。你不能通过将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; 
    } 

但上面的代码会做。

相关问题