C语言中如果函数需要一个地址,结果少打了&符号,导致实参是一个整数,请问发生了什么导致函数进不去?

C语言中如果函数需要一个地址,结果少打了&符号,导致实参是一个整数,请问发生了什么导致函数进不去?

//函数定义:
void function(int *j)
{...}

//函数的实际调用:
int main{
  ...
  function(i);
  ...
}

基于Monster 组和GPT的调写:
在调用方法时,找不到方法名为function,参数类型为int的方法、

  • 在C语言中,函数的参数传递方式有两种:传值调用和传址调用。传值调用是指函数调用时将实参的值复制一份传递给形参,而传址调用是指将实参的地址传递给形参,函数通过地址可以访问实参的值。
  • 在代码中,函数function需要一个指针类型的参数,即一个地址,但是在调用function函数时,实参i是一个整数类型的变量。如果没有使用&符号获取i的地址,那么在函数调用时,实参i的值会被复制一份传递给形参j,而不是实参的地址,因为缺少&符号。这就导致了函数参数的类型与实参类型不匹配。
  • 由于参数类型不匹配,编译器会发出警告,并且在运行时可能会导致程序崩溃或出现其他错误。当函数试图访问传递进来的参数指针所指向的内存时,由于参数类型不匹配,就会出现错误。例如,如果函数function试图向其参数指针所指向的地址写入数据,就会导致未定义行为,因为参数指针实际上指向的是一个整数,而不是一个内存地址。
  • 因此,在调用函数时,应该确保传递给函数的参数类型与函数参数类型匹配,如果函数需要一个指针类型的参数,则应该使用&符号来获取参数的地址。

调用方法时,找不到方法名为function且参数类型为int的方法

就会把整数值作为地址传进去,假如是非法地址就会异常,例如i=0x123,在函数中就会变成往0x123的位置写入,但是是非法地址,就异常。这种情况还好,要是有效地址就更危险

参考GPT和自己的思路,在 C 语言中,如果一个函数需要一个地址作为参数,但是实参提供的是一个整数,编译器会发出一个警告,但是程序会继续编译和执行。因此,在你的代码中,如果函数需要的是一个指针类型的参数,而实参是一个整数类型,编译器会将整数类型的实参隐式转换为指针类型,从而得到一个指针地址。但是,这个地址通常是无效的,因为它不是你想要的指针地址。

因此,当你在函数中使用这个参数时,会导致程序崩溃或者出现未定义的行为,因为指针指向的是无效的内存地址。解决这个问题的方法是,在函数调用时正确地使用 & 运算符来获取实参的地址,以便函数可以正确地使用指针参数。因此,正确的代码应该是:

//函数定义:
void function(int *j)
{...}
 
//函数的实际调用:
int main{
  ...
  function(&i);
  ...
}

在这个代码中,& 运算符用于获取变量 i 的地址,并将该地址作为指针参数传递给函数。这样,函数就可以正确地使用指针参数,并避免程序崩溃或出现未定义的行为。

void function(int* j) 与 void function(int j) 系统认为是两个不同的函数,在调用时会自动匹配,供参考:

#include <stdio.h>
void function(int* j)
{
    printf("%d\n", *j);
}
void function(int j)
{
    printf("%d\n", j);
}
int main()
{
    int i = 10;
    function(&i);
    function(i);
    return 0;
}