我在Visual Studio中返回字节数组时遇到问题。以下代码在联机编译器https://www.onlinegdb.com/中按预期输出
预期输出为8字节数组:BB-CC-C3-02-5C-11-6D-00
并且联机编译器输出与预期相同:
*******************************************************************************/
#include <stdio.h>
#include <stdint.h>
uint8_t * createByteArray(float power, int power_coefficient);
int main()
{
float power = 4444;
int power_coefficient = 1;
uint8_t * returned_ptr = createByteArray(power, power_coefficient);
for (int i = 0; i < returned_ptr[3]+6; i++)
printf("%02X-", returned_ptr[i]);
return 0;
}
uint8_t * createByteArray(float power, int power_coefficient)
{
uint16_t power_ushort = (uint16_t)(power * power_coefficient);
uint8_t bytes_power[2];
bytes_power[0] = (uint8_t)((power_ushort >> 8) & 0xFF);
bytes_power[1] = (uint8_t)(power_ushort & 0xFF);
uint8_t firstHalf_power = bytes_power[0];
uint8_t secondHalf_power = bytes_power[1];
int parity = (int)firstHalf_power + (int)secondHalf_power;
uint16_t parity_ushort = (uint16_t)(parity);
uint8_t bytes_parity[2];
bytes_parity[0] = (uint8_t)((parity_ushort >> 8) & 0xFF);
bytes_parity[1] = (uint8_t)(parity_ushort & 0xFF);
uint8_t firstHalf_parity = bytes_parity[0];
uint8_t secondHalf_parity = bytes_parity[1];
uint8_t telegram_set_power[8] = {0xBB, 0xCC, 0xC3, 0x02, secondHalf_power, firstHalf_power, secondHalf_parity, firstHalf_parity};
uint8_t * ptr = telegram_set_power;
return ptr;
}
但在Visual Studio 2022中,相同的代码返回以下输出:
AA-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-00-00-00-00-00-00-00-00-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-CC-A8-00-00-00-00-00-00-00-A8-00-00-00-00-00-00-00-45-64-DD-8D-FA-7F-00-00-00-00-00-00-00-00-00-00-64-00-1B-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-36-9D-EA-8D-FA-7F-00-00-A0-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-CC-F6-11-AE-2C-00-00-00-10-00-00-00-00-00-00-00-D0-F5-11-AE-2C-00-00-00-1C-00-1B-00-00-01-00-00-E0-F5-11-AE-2C-00-00-00-14-00-00-00-00-00-00-01-00-00-00-00-00-00-00-00-00-00-
我一直在试着修复它,但失败了。这可能是什么原因呢?
**编辑:**当我编译为64位时会发生这种情况。当我在x86下编译时它可以工作。但是由于一些其他原因我需要编译为x64。
1条答案
按热度按时间9gm1akwq1#
您的函数
createByteArray
返回dangling pointer,即指向该函数返回时已不存在的对象的指针。数组
telegram_set_power
是一个局部数组。因此,当函数createByteArray
返回时,它的lifetime结束。函数createByteArray
返回一个指向这个不再存在的数组的指针。在函数
main
中取消引用悬空指针returned_ptr
将调用undefined behavior。这解释了为什么你的程序看起来在一个平台上工作,但在另一个平台上不工作。为了解决此问题,您有以下选择:
1.在函数
main
中声明数组,而不是在函数createByteArray
中声明数组,并将指向该数组的指针传递给函数createByteArray
。在这种情况下,可能需要将函数createByteArray
重命名为initByteArray
,因为它不再创建数组,而只是初始化数组。1.在函数
createByteArray
中,您可以使用函数malloc
为数组分配内存,而不是将telegram_set_power
设为生存期在函数返回时结束的本地数组。这样,您就可以完全控制数组的生存期。它的生存期只有在您调用free
时才会结束。因此,返回指向此类对象的指针是安全的。一般来说,解决方案1是比较简单的解决方案,因为如果使用解决方案2,当不再需要内存时,必须记住调用
free
,否则将得到memory leak。有关如何在C中返回数组的详细信息,请参见以下问题:
Returning an array using C