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

标签 c arrays pointers language-lawyer c11

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

int (*func())[*];

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

最佳答案

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

示例原型(prototype)和函数定义:

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

float (*first_row(unsigned n, unsigned m, float (*matrix)[n][m]))[]
{
    return *matrix;
}

你会像这样调用它:

unsigned n = 3, m = 4;
float matrix[n][m];
float (*row)[m] = first_row(n, m, &matrix);

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

关于我可以返回指向 VLA 的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29576038/

相关文章:

c++ - 是否可以保证包含数组的类的大小?

java - H2数据库: Get rows from subquery as array

java - 将数组对象添加到列表

c - 在另一个结构中分配结构的内存

c - 使用memcpy时重叠的含义

c - 为什么不能将二维数组作为函数参数传递?

c++ - 如何创建变量数组 Arduino

C 指针和访问数组

c - 自纪元以来的打印时间(以纳秒为单位)

c - 将句子(行)解析为单词