微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法打印 typedef 结构的 char* 类型字段

如何解决无法打印 typedef 结构的 char* 类型字段

以下代码将十进制转换为二进制并将其二进制表示形式存储到结构体中。 get_binary_representation() 工作正常,您可以通过取消注释打印 val 的每一位的行来亲自查看。但是,当我尝试打印存储在 binary 中的二进制表示时,没有打印任何内容

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdbool.h>


typedef struct {
    char* val;
    int   length;
} binary;


char* get_binary_representation(uint16_t val,int length) {
    
    char* result; 

    if (length < 1)
        return NULL;

    if (val == 0) {
        result = (char*) malloc(sizeof(char) * 2);
        result[0] = '0';
        result[1] = '\0';
        return result;
    }

    result = (char*) malloc(sizeof(char) * length);
    result[length - 1] = '\0';

    for (int i = length; i > 0; i--) {
        result[i] = ((val & 1) == 1) ? '1' : '0';
        // printf("Bit %d = %c\n",i,result[i]);
        val >>= 1;
    }

    return result;
}


binary i16_to_binary(uint16_t* val) {
    binary result; // tried replacing it with pointer and using malloc,didn't help
    result.val = get_binary_representation(*val,16);    
    /* There is a function that finds length of number in binary 
       but I excluded it from MRE for simplicity sake. 
       16 for length because uint16_t is 16 bit integer*/
    return result;
}


int main(int argc,char** argv) {
    uint16_t a = 16; uint16_t b = 254; uint16_t c = 37;
    
    binary a_bin = i16_to_binary(&a);
    binary b_bin = i16_to_binary(&b);
    binary c_bin = i16_to_binary(&c);
    
    /* should print 0000 0000 0001 0000,0000 0000 0111 1110,0000 0000 0010 0101
       without spaces and commas */
    printf("%s %s %s\n",a_bin.val,b_bin.val,c_bin.val);

    return 0;
}

解决方法

小心:

  • 不要导致缓冲区溢出。只有索引 0length-1(两者都包含)可用于具有 length 元素的数组。 result[i]i = length 时超出范围。
  • 初始化所有要读取的元素。 reuslt[0] 未初始化。
  • malloc() 族的铸造结果是 considered as a bad practice

部分:

    if (val == 0) {
        result = (char*) malloc(sizeof(char) * 2);
        result[0] = '0';
        result[1] = '\0';
        return result;
    }

    result = (char*) malloc(sizeof(char) * length);
    result[length - 1] = '\0';

    for (int i = length; i > 0; i--) {
        result[i] = ((val & 1) == 1) ? '1' : '0';
        // printf("Bit %d = %c\n",i,result[i]);
        val >>= 1;
    }

应该是:

    if (val == 0) {
        result = malloc(sizeof(char) * 2); /* no casting the result */
        result[0] = '0';
        result[1] = '\0';
        return result;
    }

    result = malloc(sizeof(char) * (length + 1)); /* no casting the result and allocate enough elements */
    result[length] = '\0'; /* put NUL to proper place */

    for (int i = length - 1; i >= 0; i--) { /* adjust the indice */
        result[i] = ((val & 1) == 1) ? '1' : '0';
        // printf("Bit %d = %c\n",result[i]);
        val >>= 1;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。