[英]Return the pointer to array by C function
假设我有以下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 ;
// }
您刚刚创建了指针“ outvec”,但是您不知道它指向的位置。 我的意思是,您没有分配指针outvec将写入的内存。 它只是试图在随机存储空间上写入数据。
您需要在要开始写入数据的位置“告诉”指针,并保留该空间供您使用。
如Joel所说,请尝试使用以下代码:
double *outvec = malloc(3 * sizeof(double));
抱歉我的英语不好...祝你好运!
您尚未初始化outvec
指针,因此您尝试将数据写入空(或垃圾)地址。 尝试分配一些内存以使其首先指向或声明一个静态数组以从函数中返回。
例如
double *outvec = malloc(3 * sizeof(double));
由于编译器在编译时不评估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”指向
到一些垃圾地址。 这就是为什么我们需要指定要存储结果的地址,为此
我们需要使用一些有效地址来初始化或分配“ outvec”变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.