gpt4 book ai didi

c - “变量”可能在此函数中未初始化使用,有一个可行的解决方法但不明白为什么

转载 作者:行者123 更新时间:2023-12-04 01:31:24 24 4
gpt4 key购买 nike

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

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

uint8_t calcPitchRoll (imu_t * imu, float * pitch, float * roll);

调用函数看起来像(引用行号):

518 float * pRollValue, * pPitchValue; // prepare pointers to floats to store results
519 *pRollValue = 0; // initialize variables
520 *pPitchValue = 0; // initialize variables
521 calcPitchRoll (imu, pPitchValue, pRollValue);

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

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 函数时似乎具有相同的“状态”,但编译器不同意。

我(认为我)理解的是 *pRollValue = 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

这里

float PitchValue, RollValue = 0;
float * pRollValue = &RollValue; // You define a pointer and at the
// same time you initializes it to
// point to a float

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

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

代码如下

float * pF;

将为您提供保存指向 float 的指针的内存,但没有地方可以存储 float 本身。您需要为指针赋值,使其指向一个 float 。

所以你需要这样的东西:

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

关于c - “变量”可能在此函数中未初始化使用,有一个可行的解决方法但不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60947948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com