C ';变量';可以在未初始化的情况下在此函数中使用,具有工作变通方法,但不';我不明白为什么

C ';变量';可以在未初始化的情况下在此函数中使用,具有工作变通方法,但不';我不明白为什么,c,compiler-warnings,C,Compiler Warnings,我已经搜索并找到了很多类似的问题(答案无疑很好),但我还没有找到一个我完全理解的问题。我已经找到了一个可行的解决方案,我真的只是想了解在第一个示例中我做错了什么… 我编写了一个函数,通过声明从原始加速计值计算俯仰/滚动: uint8_t calcPitchRoll (imu_t * imu, float * pitch, float * roll); 调用函数如下所示(参考行号): 但是,这会导致编译器警告: main.c:519:25: warning: 'pRollValue' may b

我已经搜索并找到了很多类似的问题(答案无疑很好),但我还没有找到一个我完全理解的问题。我已经找到了一个可行的解决方案,我真的只是想了解在第一个示例中我做错了什么…

我编写了一个函数,通过声明从原始加速计值计算俯仰/滚动:

uint8_t calcPitchRoll (imu_t * imu, float * pitch, float * roll);
调用函数如下所示(参考行号):

但是,这会导致编译器警告:

main.c:519:25: warning: 'pRollValue' may be used uninitialized in this function
main.c:521:26: warning: 'pPitchValue' may be used uninitialized in this function
但是,以下方法确实有效:

float PitchValue, RollValue = 0;
float * pRollValue = &RollValue;
float * pPitchValue = &PitchValue;
calcPitchRoll (imu, pPitchValue, pRollValue);
在我看来,调用calcPitchRoll函数时,这两个示例似乎具有相同的“状态”,但编译器不同意


我(认为我)理解的是,
*prolValue=0
将该值写入变量,因此我认为在这一点上,变量分配了空间和一个值。这是一种错误的理解吗?

您的两个代码示例存在巨大差异

看看这个:

518 float * pRollValue, * pPitchValue;  // Here pRollValue is uninitialized
519 *pRollValue = 0;                    // Here you dereference pRollValue (due to the *)
    ^        
    |                           // So you dereference an uninitialized pointer
    |
    Dereference of uninitialized pointer
这里

所以这两个代码部分是完全不同的

因此,您需要了解指向类型为T的对象的指针与类型为T对象之间的区别

代码式

float * pF;
将为您提供内存,以便按住指向浮点的指针,但没有存储浮点本身的位置。您需要为指针指定一个值,使其指向浮点

所以你需要一些类似的东西:

float * pF;
float myFloatVariable;
pF = &myFloatVariable;  // Now pF points to myFloatVariable

*pF = 42;               // These two statements both sets
myFloatVariable = 42;   // the variable myFloatVariable to 42
另一种方法是动态分配,如:

float * pF = malloc(sizeof *pF);
assert(pF != NULL);

*pF = 42;               // This sets the dynamic allocated float to 42

在第一种方法中,您取消了对一个单元化指针的引用,该指针可以指向任何基本上属于未定义行为的随机内存地址(如果在全局范围中生成,则为0)。(
*prolValue=0;
)而在第二秒内,指针指向实际存在的操作数位置。因此,我认为*prolValue是一种“设置此指针指向的变量值”的方法,这是不正确的?在第518行(初始示例),我为指针创建了一个内存位置(为指针分配了内存),但没有设置值(因此指针有空间,但还没有真正的指针)。是这样吗?@DieterVansteenwegenON4DD听起来像是你得到了itOr,更正确的是,*prolValue可以用来设置指针指向的值,但我这样做的方式,指针还没有指向任何东西?(或者更糟的是,它指向的是一个随机内存地址)@DieterVansteenwegenON4DD听起来是正确的-请参阅updateOK,这现在非常有意义。非常感谢。
float * pF;
float myFloatVariable;
pF = &myFloatVariable;  // Now pF points to myFloatVariable

*pF = 42;               // These two statements both sets
myFloatVariable = 42;   // the variable myFloatVariable to 42
float * pF = malloc(sizeof *pF);
assert(pF != NULL);

*pF = 42;               // This sets the dynamic allocated float to 42