首页 > 解决方案 > 将指针传递给 C 中的函数

问题描述

我今年要学习数据结构课程,所以我决定通过做一些关于 C 中指针的简单任务来更新我对 C 的了解,我注意到关于将指针传递给函数的一件事,我真的无法理解.

假设我们有一个函数:

void assignValueTen(int *var){
     *var=10;
}

我们可以像这样从 main 调用这个函数:

int main( void ){
     int x;
     assignValueTen(&x);
     printf("The value of x is %d.\n",x);
     return 0;
}

其输出将是:

The value of x is 10.

我们也可以这样调用这个函数:

int main( void ){
     int x, *y;
     y=&x;
     assignValueTen(y);
     printf("The value of x is %d.\n",x);
     return 0;
}

其输出也将是:

The value of x is 10.

但是,下面的语句没有按预期工作:

int main( void ){
     int *x;
     assignValueTen(x);
     printf("The value of x is %d.\n",*x);
     return 0;
}

上面代码的输出是:

Process exited after 6.723 seconds with return value 3221225477

那么,为什么代码可以编译但不能按预期工作?
是不是因为在上一个示例之前指针尚未分配给任何地址?
有人可以更详细地解释为什么会发生这种情况吗?
非常感谢!

标签: cfunctionpointerspass-by-reference

解决方案


一个不起作用是因为 x 没有特别分配任何值。函数中的赋值是在未初始化变量碰巧指向的任何地方进行赋值,并且这不太可能是有效地址(因为硬件看到的东西),即使它是有效的(再次根据硬件),它也不在你应该的地方正在写入(因为地址将“属于”您在 main 中运行的代码以外的其他内容)。

您应该只访问您有理由知道有效的地址(您的 assignValueTen 函数具有诸如隐式要求),尽管其他一些语言可以执行此类要求合同,但 C 并没有真正的方法。


推荐阅读