C语言函数参数传递的错误与避免

今日第二更嘿嘿

前言:博主在实现各种排序算法时很多函数的参数传递方法啥的出现了很多记忆的错误,因此停下来总结一下这些容易犯的错误同时方便自己将来复习

函数参数的调用

调用类型 描述
传值调用 该方法把参数的实际值复制给函数的形式参数。对应下述ERROR1
在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用 通过指针传递方式,形参为指向实参地址的指针,对应正确写法
当对形参的指向操作时,就相当于对实参本身进行的操作。

例:利用Swap函数交换变量a,b的常见错误

ERROR1——使用局部变量代替原始变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Sawp_error1(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10;
int b = 20;
Sawp_error1(a,b);
printf("a = %d\nb = %d\n",a,b);
return 0;
}

运行结果:

1
2
3
4
5
a = 10
b = 20

Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.

局部变量:定义在函数内部的变量,只能在函数内部使用。 上面代码里在main函数中定义的a,b与Swap函数中a,b只是同名,只在Swap函数中交换a与b的值而不影响main函数中的原始变量a与b的值

ERROR2——只交换了地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Sawp_error2(int *p1,int *p2)
{
int *tmp;
tmp = p1;//将a的地址赋值给tmp
p1 = p2;
p2 = tmp;
}
int main()
{
int a = 10;
int b = 20;
Sawp_error2(&a,&b);
printf("a = %d\nb = %d\n",a,b);
return 0;
}

运行结果:

1
2
3
4
5
a = 10
b = 20

Process returned 0 (0x0) execution time : 0.015 s
Press any key to continue.

可以看到上述代码并没有完成对ab的交换。

在上面代码中Swap函数虽然使用了指针,但是未做取值运算,所以只是将两个变量a,b的存储位置交换了一下

ERROR3——野指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Sawp_error2(int *p1,int *p2)
{
int *tmp=*p1;//野指针
*p1=*p2;
*p2=*tmp;
}
int main()
{
int a = 10;
int b = 20;
Sawp_error3(&a,&b);
printf("a = %d\nb = %d\n",a,b);
return 0;
}

输出结果:

1
2
3
4
———————————

Process returned -1073741819 (0xC0000005) execution time : 1.663 s
Press any key to continue.

上述程序在运行了一段时间之后就崩了,没有输出任何东西,这是因为我们在给tmp初始化的时候直接把P1的值,也即a的值当做地址赋给了tmp,导致tmp指向了不能访问的地区导致了程序崩溃。

野指针(悬挂指针):没有访问权限的指针,这个指针有可能存在也有可能不存在,但是你不能访问。(野指针不好判断) 1、地址不存在(例如电话号码少一位)。 2、地址存在,但是不能访问(例如电话号码写成别人)。 3、地址之前可以访问,但现在不可以(更换电话号码)

正确写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Sawp_error2(int *p1,int *p2)
{
int tmp;
tmp = *p1;//tmp=a
*p1 = *p2;//a=b
*p2 = tmp;//b=tmp
}
int main()
{
int a = 10;
int b = 20;
Sawp(&a,&b);
printf("a = %d\nb = %d\n",a,b);
return 0;
}

结论 一个函数(父函数)调用另一个函数(子函数),想通过子函数修改父函数的数据,必须传指针,子函数内部解引用。也就是子函数的改变要想影响父函数的数据必须传指针和解引用。 error1中既没有指针也没有解引用,error2中只是传指针但在Swap函数中没有使用解引用 error3中传了野指针导致程序崩溃。

参考文章:C语言中利用Swap函数交换变量a,b

菜鸟教程——C函数