我可以返回指向 VLA 的指针吗?

AnA*_*ons 4 c arrays pointers language-lawyer c11

这样的函数原型在C中有效吗?

int (*func())[*];
Run Code Online (Sandbox Code Playgroud)

如果是的话,我该如何定义这样的函数?

Chr*_*oph 5

您应该返回一个指向不完整数组类型的指针,因为*可变长度数组的表示法仅在参数列表中有效。

原型和函数定义示例:

extern float (*first_row(unsigned, unsigned, float (*)[*][*]))[];

float (*first_row(unsigned n, unsigned m, float (*matrix)[n][m]))[]
{
    return *matrix;
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样调用它:

unsigned n = 3, m = 4;
float matrix[n][m];
float (*row)[m] = first_row(n, m, &matrix);
Run Code Online (Sandbox Code Playgroud)

请注意,如果函数具有自动存储持续时间,则返回指向已在函数内声明的数组(可变长度或其他)的指针是未定义的行为。这意味着您只能返回指向作为参数传入或动态分配的可变长度数组的指针。