用形参返回指针
用函数返回
用全局变量返回
用引用返回C++
#include <stdio.h>
typedef unsigned char uchar;
//---------------------------------------------------全局变量
uchar *t;
//---------------------------------------------------子函数声明
void func3(void); //利用全局变量返回数组
void func2(uchar *s); //利用指针返回数组
uchar *func1(); //利用指针函数返回数组
void func0(uchar *&r); //利用引用返回数组
//---------------------------------------------------主函数
int main(){
//利用全局变量返回数组
printf("利用全局变量返回数组:");
func3();
printf("%#.2X %#.2X\n",t[0],t[1]);
//利用指针作为形参返回数组
printf("利用指针形参返回数组:");
uchar *p;
func2(p);
printf("%#.2X %#.2X\n",p[0],p[1]);
//利用指针函数返回数组
printf("利用指针函数返回数组:");
uchar *q;
q=func1();
printf("%#.2X %#.2X\n",q[0],q[1]);
//利用引用返回数组
printf("利用引用类型返回数组:");
uchar *r;
func0(r);
printf("%#.2X %#.2X\n",r[0],r[1]);
}
//---------------------------------------------------子函数定义
//利用全局变量返回数组
void func3(void){
uchar a[]={0xA5,0xC8,0x1E,0xFF};
t=a;
}
//利用指针作为形参返回数组
void func2(uchar *s){
uchar a[]={0xA5,0xC8,0x1E,0xFF};
for(int i=0;i<4;i++){
s[i]=a[i]; //s[i]即*(s+i)
}
}
//利用指针函数返回数组
uchar *func1(){
uchar a[]={0xA5,0xC8,0x1E,0xFF};
// 注意可能出现warning: function returns address of local variable,可加上static解决
// static uchar a[]={0xA5,0xC8,0x1E,0xFF};
return a;
}
//C++中利用变量类型引用返回数组
void func0(uchar *&r){
uchar a[]={0xA5,0xC8,0x1E,0xFF};
r=a;
}
注意:
利用指针函数返回数组时,用指针变量接收返回的数组名(不能用数组名来接收数组名),然后要把指针变量变还原为应该传回的数组再进行调用(若直接调用指针变量,则存在潜在的漏洞:地址复用,容易出现隐藏的bug)。
//利用指针函数返回数组
#include <stdio.h>
typedef unsigned char uchar;
uchar *func1(){
uchar a[]={0xA5,0xC8,0x1E,0xFF};
return a;
}
int main(){
uchar *pa;
uchar a[4];
pa = func1(); // 指针接收返回的数组名,可以直接调用指针,但存在地址复用的隐藏bug的风险
for(int i=0;i<4;++i){ // 先将指针转为数组再进行调用
a[i] = *(pa+i);
}
return 0;
}