c - 将指针传递给 C 中的函数

标签 c function pointers pass-by-reference

今年我要学习数据结构类(class),所以我决定通过做一些关于 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

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

最佳答案

不起作用的是因为 x 没有被分配任何特定的值。函数中的赋值是在未初始化的变量恰好指向的地方进行赋值,并且该地址不太可能是有效地址(如硬件所见),即使它是有效的(再次根据硬件),它也不在您< em>应该写入(因为该地址“属于”除您在 main 中运行的代码之外的其他内容)。

您应该只访问您有理由知道有效的地址(您的 allocateValueTen 函数具有诸如隐式要求),尽管其他一些语言可以,但 C 确实没有办法强制执行此类要求契约(Contract)。

关于c - 将指针传递给 C 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52683595/

相关文章:

c - 如何读取 12 位的 i2c lis3dh 寄存器值?

在并行 for 循环中调用函数

c - 在 C 预处理器中比较字符串的方法? (海合会)

javascript - 使用 Javascript 连接文本框

c - 从动态分配的数组中调用值

c++ - 指针和指向该指针的地址会导致相同的结果

C++ 指针参数在 'ret' 指令之前设置为 NULL

c - 我如何在 C 中生成随机 double ?

python - 为 groupby 列编写自定义函数

java - 在不同文件中向 Java 类添加方法而不扩展该类