1、c语言数组作为形参会退化成数组指针
#include "stdio.h"
#include <stdlib.h>
//数组作为函数的形参会退化成指针
void print_arr(int a[5]);// int *b
int main()
{
int arr[5] = { 1,2,3,4,5 };
print_arr(arr);
return 0;
}
void print_arr(int a[5]) {
printf("a[0]:%d\n", a[0]);//1
printf("len:%d\n", sizeof(a) / sizeof(int));//1
printf("len:%d\n", sizeof(a) / sizeof(a[0]));//1
for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
printf("i:%d\n", a[i]);
}
}
2、数组作为形参,需要传递数组的长度
#include "stdio.h"
#include <stdlib.h>
//数组作为函数的形参会退化成指针
void print_arr(int a[5],int len);// int *b
int main()
{
int arr[5] = { 1,2,3,4,5 };
print_arr(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
void print_arr(int a[5],int len) {
printf("a[0]:%d\n", a[0]);
printf("len:%d\n", sizeof(a) / sizeof(int));
printf("len:%d\n", sizeof(a) / sizeof(a[0]));
for (int i = 0; i < len;i++) {
printf("i:%d\n",a[i]);
}
}
3、指针作为返回值问题,不要使用指针指向函数的局部变量,可能导致程序错误
#include "stdio.h"
#include <stdlib.h>
//数组作为函数的形参会退化成指针
int * print_p();// int *b
int main()
{
int* p = print_p();//p指向print_p内部的局部变量,函数print_p执行结束,num会被释放
//如果num恰好被系统分配给别的变量,导致系统bug
printf("p:%d\n",*p);
}
int * print_p() {
int num = rand(NULL);//程序结束,局部变量num会被释放
printf("num:%d\n", num);
return #
}
模拟num被修改
#include "stdio.h"
#include <stdlib.h>
//数组作为函数的形参会退化成指针
int * print_p();// int *b
void* print_pp(int * p);
int main()
{
int* p = print_p();//p指向print_p内部的局部变量,函数print_p执行结束,num会被释放
//如果num恰好被系统分配给别的变量,导致系统bug
print_pp(p);
printf("p:%d\n",*p);
}
int * print_p() {
int num = rand(NULL);//print_p函数结束,局部变量num会被释放
printf("num:%d\n", num);
return #
}
void* print_pp(int* p) {
*p = 20;
};
正确做法,可以通过全局变量进行接收
#include "stdio.h"
#include <stdlib.h>
//数组作为函数的形参会退化成指针
int * print_p();// int *b
void* print_pp(int * p);
int num;
int main()
{
int* p = print_p();//p指向全局变量num
printf("p:%d\n",*p);
}
int * print_p() {
num = rand(NULL);//print_p函数结束,变量num不会被释放
printf("num:%d\n", num);
return #
}