【问题标题】:Allocating return pointer in child function with malloc() but not getting return data使用 malloc() 在子函数中分配返回指针但未获取返回数据
【发布时间】:2017-07-05 19:48:40
【问题描述】:

谁能帮我理解为什么我在主循环中的 printf 语句什么也没打印?如果我在主循环中添加一个常规的 hello world printf 语句,它也不会向控制台打印任何内容。但是,如果我注释掉打印返回数据的行,这个 hello world 打印语句确实有效。

我尝试了多种在两个函数之间传递字符串数据的方法,但都没有成功。

char * getADCValue()
{
    uint8_t id;
    int32_t adc;
    int32_t volt;
    uint8_t i;
    uint8_t ch_num;
    int32_t iTemp;
    uint8_t buf[3];

    bcm2835_spi_begin();
    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_LSBFIRST );   
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE1);
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_1024);
    bcm2835_gpio_fsel(SPICS, BCM2835_GPIO_FSEL_OUTP);   
    bcm2835_gpio_write(SPICS, HIGH);
    bcm2835_gpio_fsel(DRDY, BCM2835_GPIO_FSEL_INPT);
    bcm2835_gpio_set_pud(DRDY, BCM2835_GPIO_PUD_UP);

    id = ADS1256_ReadChipID();
    /*if (id != 3)
    {
        printf("Error, ASD1256 Chip ID = 0x%d", (int)id);
    }
    else
    {
        printf("Ok, ASD1256 Chip ID = 0x%d", (int)id);
    }*/

    ADS1256_CfgADC(ADS1256_GAIN_1, ADS1256_15SPS);
    ADS1256_StartScan(0);

    while((ADS1256_Scan() == 0));
    adc = ADS1256_GetAdc(0);
    volt = (adc * 100) / 167;

    buf[0] = ((uint32_t)adc >> 16) & 0xFF;
    buf[1] = ((uint32_t)adc >> 8) & 0xFF;
    buf[2] = ((uint32_t)adc >> 0) & 0xFF;

    iTemp = volt;   /* uV */

    char * return_data = malloc(1024);

    if (!return_data)
     return NULL;

    sprintf(return_data, "%ld.%01ld V", iTemp /1000000, (iTemp%1000000)/100000);

    return return_data;

}

int  main()
{
    char * returnValue  = getADCValue();
    printf("Voltage Value: %s", returnValue);
    free(returnValue);
    return 0;
}

【问题讨论】:

  • 您确定\r 字符吗?他们倾向于在行首移动光标,可能会覆盖某些文本。
  • 好主意。我尝试将它们从 sprintf 格式中删除,但没有成功。
  • 大概你知道你正在泄漏函数返回的内存,因为你没有捕获指针并将它传递给free()。然而,这不是眼前的问题。你检查内存分配成功了吗?不知何故,这可能是您的问题的一个因素吗?还要注意,序列通常是\r\n 而不是\n\r。同样,尚不清楚这可能是问题所在。
  • 是的,还没到。我进行了编辑以包括内存清除和检查内存分配。删除了新行并返回。到目前为止还没有运气。
  • 您使用%ld 作为格式说明符。你确定int32_t iTemp;long

标签: c


【解决方案1】:

感谢大家的建议。它最终成为建议的 bcm 库调用。不知何故,我的 bcm2835 初始化调用丢失了,这导致我的文件描述符出现问题。

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2012-08-21
    • 1970-01-01
    • 2011-10-26
    • 2015-02-05
    相关资源
    最近更新 更多