c语言.返回函数的类型

Jag*_*gan 0 c

?? fun()
{
   int a[3]={3,3,4};
   return &a; 
}
Run Code Online (Sandbox Code Playgroud)

什么是兼容的返回类型.这里指针指向3个整数的数组,而不仅仅是指向整数数组的指针.目标是返回一个指向3个整数数组的指针.

Ale*_* C. 14

首先,你真的应该不会返回一个局部变量的地址.当函数退出时,数组a将被销毁.

至于你的问题的类型,&aint (*)[].


nos*_*nos 5

不要这样做.

您正在返回指向局部变量的指针.当函数返回时,该指针指向一个不再有效的位置,因此这个练习毫无意义.虽然返回类型是int (*)[3],但是当你使用它作为函数的返回类型时,原型将是int (*fun(void))[3](呃,eew)

然而

如果a是静态的,你可以做到

int (*fun(void))[3]
{ 
   static int a[3]={3,3,4}; 
   return &a;
}
Run Code Online (Sandbox Code Playgroud)

返回一个指向数组中第一个元素的指针是比较常见的 - 尽管你必须在调用者中"知道"你可以访问3并且只能访问该指针的3个元素.

int *fun(void)
{ 
   static int a[3]={3,3,4}; 
   return &a[0]; // or just return a;
}
Run Code Online (Sandbox Code Playgroud)

由于a在这些情况下是静态的,您将不得不担心重入

2种更常见的实现方法:

通过参数传入数组并在调用者中分配:

void fun(int *a)
{ 
       a[0] = 3;
       a[1] = 3;
       a[2] = 4;

}
Run Code Online (Sandbox Code Playgroud)

称之为:

int a[3];
fun(a);
Run Code Online (Sandbox Code Playgroud)

动态分配内存:

int *fun(void) 
{
  int *a = malloc(3*sizeof *a);
  if(a) {
     a[0] = 3;
     a[1] = 3;
     a[2] = 4;
   }
   return a;
}
Run Code Online (Sandbox Code Playgroud)

称之为:

int *a;
a = fun();
if(a) {
  ///use a
  free(a); // remember to free it when done
} else {
  //out of memory
}
Run Code Online (Sandbox Code Playgroud)