记录一下自己写C代码的常犯错误
1.指针作为形参,在子函数内部赋予指针数组地址,跳出子函数后数据会丢失
#include <stdio.h>
void func(int *p)
{
int nums[5] = {0, 1, 2, 3, 4};
p = nums;
int i = 0;
for( i = 0; i<5; i++)
printf("p[%d] = %d \n", i, p[i]);
}
int main()
{
//int nums[5] = {0, 1, 2, 3, 4};
int *num;
func(num);
int i = 0;
for( i = 0; i<5; i++)
printf("num[%d] = %d \n", i, num[i]);
return 0;
}
运行结果
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4
num[0] = 1526752
num[1] = 0
num[2] = 1
num[3] = 0
num[4] = 0
2.指针作为形参,在子函数内部采用下标修改指针的值会溢出
原因是在主函数中没有为指针分配连续的内存
#include <stdio.h>
void func(int *p)
{
int i = 0;
for( i = 0; i<5; i++)
{
p[i] = i;
printf("p[%d] = %d \n", i, p[i]);
}
}
int main()
{
//int nums[5] = {0, 1, 2, 3, 4};
int *num;
func(num);
int i = 0;
for( i = 0; i<5; i++)
printf("num[%d] = %d \n", i, num[i]);
return 0;
}
运行结果
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4
num[0] = 0
num[1] = 1
num[2] = 2
num[3] = 3
num[4] = 4
上面结果是用dec-c++跑的,编译通过输出也没有问题,但是在单片机里报了错。
采用指针访问动态内容时,要用分配内存!
形参为指针或数组(首地址)时,对于实参是等价的(都是传入一个地址)
因此为了安全,当传入的地址本身是数组时,形参应当使用数组,保证实参的地址不改变(实参可能是数组或指针,如果是指针,在子函数里改变了所指地址,就会导致子函数结束后所指变量被释放)