在C中将十进制数转换为二进制数

时间:2014-04-17 18:32:37

标签: c malloc

我试图将小数从[0, 255]转换为8位二进制数,其中每个位将用逗号和空格分隔。我尝试了以下(最终它工作,除了最后一位不需要任何分隔符):

#include <stdio.h>
#include <stdlib.h>

char* atobin(int input) {
    char *str = malloc(0);
    int index, count = 0;
    if (input > 255| input < 0) {
        printf ("Input out of range. Abort.\n");
        exit(EXIT_FAILURE);
    }

    for (index = 7; index >= 0; index--) {
        *(str + (count++)) = (input >> index & 1) ? '1' : '0';
        *(str + (count++)) = ',';
        *(str + (count++)) = ' ';
    }
    *(str + count) = '\0';
    return str;
}

int main(int argc, char *argv[]) {
    printf("%s\n", atobin(atoi(argv[1])));
    return EXIT_SUCCESS;
}

现在我有几个问题:

  1. 我使用了malloc(0);就我而言,它会 从堆中分配没有内存。那么,它是如何/为什么有效?
  2. 声明*(str + count) = '\0';是否必要?
  3. 有没有办法优化此代码?
  4. 更新

    要继续此实验,我已将atobin函数放入.h文件中。这次它会产生一些问题。 现在我添加我的最后一个问题:

    malloc的参数应该使用什么最小整数?一些反复试验的方法让我觉得我应该512。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

  1. 来自malloc doc:
  2.   

    如果size为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用。

    它对你有用只是运气。尝试一些随机的malloc并随后免费,你很有可能 - 但不能保证 - 你会崩溃。

    1. 此null终止字符串。如果需要,取决于您希望如何使用字符串。您示例中的printf需要它,因为这是了解字符串何时结束的唯一方法。

    2. 对不起,我没有时间仔细看看。

答案 1 :(得分:2)

malloc(0)有效使用。它返回的是实现定义。但是,如果通过malloc(0)返回的指针访问对象,则会发生什么?undefined behavoiur。您可以阅读this相关问题 在C中,因为字符串是由\0终止的字符数组,所以最好使用*(str + count) = '\0';语句来设置字符串的最后一个字符。它正在使用此代码,但最好始终在代码中设置字符串的结尾。如果位设置为0,它可能有效,因为它与终止字符串相同。