C-函数定义有参数指针,调用时传递的变量不是指针,而是编译和运行(有时)。怎么用?

C-函数定义有参数指针,调用时传递的变量不是指针,而是编译和运行(有时)。怎么用?,c,function,pointers,compiler-errors,cygwin,C,Function,Pointers,Compiler Errors,Cygwin,这是我的第一个问题,所以我希望我能很好地理解我的意思 由于我的博士项目(航空航天)的需要,我最近在多年后回到了C。我不是一个真正的软件开发人员,但我通常能过得去。在过去的几年里,我一直在使用MATLAB,所以我发现回到C语言的美妙世界和更严格的规则的过渡有点棘手 我得到了一些代码,我必须通过添加额外的函数来调整这些代码,而我对现有的代码感到困惑。很遗憾,重新编写整个代码库不是一个选项 有些函数在其定义/声明中显示为接受指针作为参数。然而,这些函数随后主要由变量本身调用。函数体中没有延迟。但是代码

这是我的第一个问题,所以我希望我能很好地理解我的意思

由于我的博士项目(航空航天)的需要,我最近在多年后回到了C。我不是一个真正的软件开发人员,但我通常能过得去。在过去的几年里,我一直在使用MATLAB,所以我发现回到C语言的美妙世界和更严格的规则的过渡有点棘手

我得到了一些代码,我必须通过添加额外的函数来调整这些代码,而我对现有的代码感到困惑。很遗憾,重新编写整个代码库不是一个选项

有些函数在其定义/声明中显示为接受指针作为参数。然而,这些函数随后主要由变量本身调用。函数体中没有延迟。但是代码编译和运行成功,并且与执行相同功能的MATLAB脚本相比,给出了预期的输出。这怎么可能

原始代码:

// "Toy Model" of original code - this works and produces expected outputs
// myFileName.c

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include "myFileName.h" //Contains function declarations

#define FACTOR (4.5) //for example

//Original function definition
void originalFunction(const double * const P1, const double * const P2, double * P_res)
{
double P1nu[3];
double aMatrix[3][3];

/*Example of function body - this function calls another, using the input argument P1 which is not dereferenced in this function either*/
matMultVector(aMatrix, P1, P1nu);

P_res = P1nu * FACTOR;

}

int main()
{
double P1[3];
double P2[3];
double P_res[3];

P1[0] = 2;
P1[1] = 1;
P1[2] = 4;

P2[0] = 100;
P2[1] = 240;
P2[2] = 310;

originalFunction(P1, P2, P_res);

printf("Output:\n");
printf("P_resX: %lf\n", P_res[0]);
printf("P_resY: %lf\n", P_res[1]);
printf("P_resZ: %lf\n", P_res[2]);
)

return (0);
}
研究这一点告诉我,当函数在预期的时间内没有收到指针时,就会发生这种情况。但是,我无法理解为什么原始函数不会出现这种情况,为什么我的函数会出现这种情况

我也尝试过在没有指针的情况下定义P3,但是在编译时出现了一个不兼容的类型错误

知道发生了什么事吗

非常感谢

编辑:我在审阅评论后意识到,这不是一个最低限度的工作示例,我很抱歉。为了提问,我试图简化代码,但没有确保这个简化的代码实际上是正确的,并且其中有错误,这些错误已经被其他人正确地发现了,但是这些错误在原始代码中并不存在,也不属于我的问题(例如因子乘法)。我现在不打算编辑代码,因为我想我会引起更多的混乱

有些函数在其定义/声明中显示为接受指针作为参数。然而,这些函数随后主要由变量本身调用。函数体中没有延迟。但是代码编译和运行成功,并且与执行相同功能的MATLAB脚本相比,给出了预期的输出。这怎么可能

数组基础知识:每当在表达式中使用数组时,“衰减”为指向第一个元素的指针。数组的第一个元素是有效的、已分配的内存块。研究此:

至于函数出错的原因,
matMultVector
函数显然希望第三个参数指向某个有效内存。但是在
myFunction
中,您只需将一个未初始化的指针
P3
扔给它,它不指向任何地方。在尝试调用函数之前,请调查函数
matMultVector
的功能

有些函数在其定义/声明中显示为接受指针作为参数。然而,这些函数随后主要由变量本身调用。函数体中没有延迟。但是代码编译和运行成功,并且与执行相同功能的MATLAB脚本相比,给出了预期的输出。这怎么可能

数组基础知识:每当在表达式中使用数组时,“衰减”为指向第一个元素的指针。数组的第一个元素是有效的、已分配的内存块。研究此:


至于函数出错的原因,
matMultVector
函数显然希望第三个参数指向某个有效内存。但是在
myFunction
中,您只需将一个未初始化的指针
P3
扔给它,它不指向任何地方。在尝试调用函数之前,请调查函数matMultVector的功能。

您的P3没有分配的内存
double*P3=malloc(sizeof(double)*3)尝试类似的方法或使用与原始
双P3[3]相同的初始化

您的原始代码似乎还有许多其他问题:
P_res=P1nu*因子不是有效的表达式。
*P_res=*P1nu*因子可以工作,或者

  int i; // at the top
  for (i = 0; i < 3; ++i)
  {
    P_res[i] = P1nu[i] * FACTOR;
  }
inti;//在顶端
对于(i=0;i<3;++i)
{
P_res[i]=P1nu[i]*因子;
}
取决于实际需要实现的目标

作为如何继续学习您不熟悉的代码的建议,尝试一点一点地更改代码,这样您就可以立即看到是什么破坏了代码,不要一次尝试几次更改,这会让您不必要地感到困惑。
不幸的是,坐在那里阅读大量的代码是了解别人编写的代码库的一部分,但是小而仔细的实验可以帮助您更容易理解、更快。但是,在不了解实际情况的情况下尝试替换较大的内存块必然会导致问题。

您的P3没有分配的内存
double*P3=malloc(sizeof(double)*3)尝试类似的方法或使用与原始
双P3[3]相同的初始化

您的原始代码似乎还有许多其他问题:
P_res=P1nu*因子不是有效的表达式。
*P_res=*P1nu*因子可以工作,或者

  int i; // at the top
  for (i = 0; i < 3; ++i)
  {
    P_res[i] = P1nu[i] * FACTOR;
  }
inti;//在顶端
对于(i=0;i<3;++i)
{
P_res[i]=P1nu[i]*因子;
}
取决于实际需要实现的目标

作为如何继续学习您不熟悉的代码的建议,尝试一点一点地更改代码,这样您就可以立即看到是什么破坏了代码,不要一次尝试几次更改,这会让您不必要地感到困惑。 坐在那里阅读大量的代码是了解其他人编写的代码库的一部分,但要小心谨慎
  int i; // at the top
  for (i = 0; i < 3; ++i)
  {
    P_res[i] = P1nu[i] * FACTOR;
  }
double P1[3];
double P2[3];
double P_res[3];
originalFunction(P1, P2, P_res);
originalFunction( &P1[0], &P2[0], &P_res[0] );
double* P3; //intermediate variable.

originalFunction(P1, P2, P3);
P_res = P1nu * FACTOR;
for ( size_t i = 0; i < NUM_ELEMENTS; i++ )
  P_res[i] = P1nu[i] * FACTOR;
// My new function definition
void myFunction(const double * const P1, const double * const P2, double * myP_res) {
originalFunction(P1, P2, myP_res);
}
// My new function definition
void myFunction(const double * const P1, const double * const P2, double * myP_res) {
int i;
double P3[3]; //intermediate variable.
originalFunction(P1, P2, P3);
for (i = 0; i < sizeof(P3)/sizeof(P3[0]); i++)
    myP_res[i] = P3[i];
}