返回一个指向未知大小数组的指针,并将其提升到所需的长度



我有一个函数,它取两个变维二维矩阵,返回一个等维矩阵。

double (*sumOfMatrices(size_t rows, size_t columns, double matrixA[][columns], double matrixB[][columns]))[] {
double (*result)[columns]= malloc(rows * sizeof *result);
for (size_t i = 0; i < rows; i++)
{
for (size_t j = 0; j < columns; j++)
{
result[i][j]= matrixA[i][j] + matrixB[i][j];
}
}
return result;
}

然后像这样声明一个变量

double (*sumResult)[n]= sumOfMatrices(m, n, matrixA, matrixB);

这是未定义行为吗?编译器什么也没说,但是我觉得用double(*)[]初始化double(*)[n]是在隐式地提升数据类型。是否有一种方法,我可以返回double(*)[columns]代替?

此代码有效。

函数的返回类型为double (*)[],即指向double类型的未指定大小的数组的指针。该函数中的return语句将double (*)[columns]类型转换为该类型,调用函数中的返回值赋值执行相反的转换。

如果两个指针类型指向兼容的类型,则它们是兼容的。现在我们比较double [columns]double []类型。如果元素类型兼容,则两个数组兼容;如果两个数组都指定了大小,则两个数组的大小相同。因为只有一个指定了大小,所以数组类型是兼容的,因此指向数组的指针也是兼容的。

C标准的第6.7.6.1p2和6.7.6.2p6节更详细地说明了这种兼容性:

6.7.6.1p2

要使两个指针类型兼容,它们必须具有相同的限定条件,并且都应是指向兼容类型的指针。

6.7.6.2p6

对于兼容的两个数组类型,它们必须具有兼容的元素类型,如果两个大小说明符都存在,并且都是整数常量表达式,那么两个大小说明符都存在说明符应具有相同的常数值。如果在上下文中使用这两种数组类型这要求它们是兼容的,这是未定义的行为,如果两个大小说明符求值为不等值。

假设n是5。然后,该函数创建一个指向类型为double (*)[5]的数组的指针。当从函数返回该类型时,将其转换为double (*)[],然后将其赋值给与原始类型匹配的sumResult时,将其转换回double (*)[5]

所以两个转换都是有效的,并且使用sumResult是有效的。

最新更新