假设我有以下C函数:
double * cross_product( double vec1[3], double vec2[3] )
{
double *outvec ;
*(outvec + 0)= vec1[1]*vec2[2] - vec1[2]*vec2[1];
*(outvec + 1)= vec1[2]*vec2[0] - vec1[0]*vec2[2];
*(outvec + 2)= vec1[0]*vec2[1] - vec1[1]*vec2[0];
return outvec ;
}
为什么程序在执行时返回错误,而不是在编译阶段返回错误??
这个也不行
double * cross_product_2( double vec1[3], double vec2[3] )
{
double var ;
double *outvec = &var;
*(outvec + 0)= vec1[1]*vec2[2] - vec1[2]*vec2[1];
*(outvec + 1)= vec1[2]*vec2[0] - vec1[0]*vec2[2];
*(outvec + 2)= vec1[0]*vec2[1] - vec1[1]*vec2[0];
return outvec ;
// }
最佳答案
double *outvec
包含垃圾,因为您没有初始化或分配任何值
为了它。
“outvec”上的任何操作都是对垃圾的操作,因此结果也包含垃圾。
第二个代码中的更正:
REVISED CODE
double * cross_product_2( double vec1[3], double vec2[3] )
{
double *outvec = NULL; // new change
outvec = (double *)malloc(sizeof(double)*3); //since you need space for 3
//doubles
/*
*(outvec + i) means, that the calculated value is to be stored at the ith
index of the address pointed to by the outvec pointer. That is how arrays
are indexed using pointers
*/
*(outvec + 0)= vec1[1]*vec2[2] - vec1[2]*vec2[1];
*(outvec + 1)= vec1[2]*vec2[0] - vec1[0]*vec2[2];
*(outvec + 2)= vec1[0]*vec2[1] - vec1[1]*vec2[0];
return outvec ;
// }
说明:
您已经声明了以下变量-
双*输出矢量;
“outvec”是一个指针,用于存储将存储结果的地址。作为指针,变量“outvec”将指向存储结果的地址。
但是由于您没有指定该地址,因此“outvec”点
到某个垃圾地址。
这就是为什么我们需要指定存储结果的地址,为此
我们需要用一些有效的地址初始化或分配“outvec”变量。
关于c - 用C函数将指针返回数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25814223/