函数未按Visual Studio中的预期返回字节数组

mgdq6dx1  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(98)

我在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。

9gm1akwq

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

相关问题