【问题标题】:why this code doesn't print "20"? [closed]为什么这段代码不打印“20”? [关闭]
【发布时间】:2016-08-03 09:09:21
【问题描述】:
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));

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

【问题讨论】:

  • 因为 C 给了你足够的绳子让你上吊。
  • 删除x=(int*)malloc(sizeof(int));, %d --> "%d\n"
  • 不要在 C 中强制转换 malloc 的结果,使用 sizeof(*x) 代替 sizeof(int)。
  • 您正在传递堆栈变量的地址,分配一些堆内存,并将其中的值设置为 20,您永远不会修改堆栈变量。相反,您正在泄漏内存
  • 不要撒谎。 printf(%d,y); 编译?把我吊起来。

标签: c memory-management malloc heap-memory stack-memory


【解决方案1】:

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

y 的地址被传递给函数。保存y 地址的函数中的指针x 被malloc 分配的有效内存地址覆盖。一个 int 被写入那里,而不是y,因为指针的值已更改。然后函数返回(fun 中分配的内存确实“泄漏”)。

主中y 的值保持不变。

定义了这个程序的行为。

【讨论】:

  • @user3781974 您的问题代码中有几个拼写错误。请修复它们。
【解决方案2】:

嘿,您正在传递被压入堆栈的变量 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);
}

【讨论】:

  • 您给出的示例是错误的,因为内存分配给 main 中的 y 和 y remians uninitialized 的副本。所以基本上它有 未定义的行为。
  • 你到底为什么要使用双重间接?为什么不 void fun(int *x) { *x = 20; } 而只是在 main 中传递 int y; fun(&y);?
  • @EliasVanOotegem 因为OP遵循的是动态内存分配的例子,所以答案与问题有关。
【解决方案3】:
x=(int*)malloc(sizeof(int));  //x point to a new addr.

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

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

【讨论】:

    【解决方案4】:

    我想你想要做的是在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;
       }
    

    但是上面的代码就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2023-03-25
      • 1970-01-01
      • 2022-12-18
      • 2018-08-19
      相关资源
      最近更新 更多