我试图将十进制从[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) = ' ';
return str;
}
int main(int argc, char *argv[]) {
printf("%sn", atobin(atoi(argv[1])));
return EXIT_SUCCESS;
}
现在我有几个问题:
- 我使用
malloc(0)
;就我而言,它会不从堆中分配内存。那么,它是如何/为什么工作的呢 - 声明
*(str + count) = ' ';
是否必要 - 有什么方法可以优化这个代码吗
更新
为了进行这个实验,我把atobin
函数带到了一个.h
文件中。这一次它制造了一些问题。现在我补充最后一个问题:
malloc
参数的最小整数应该是多少?一些试错的方法让我猜测它应该是512
。知道吗?
- 从malloc文档:
如果大小为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被取消引用。
它对你有效只是运气。尝试一些随机的malloc,然后免费,你很有可能(但不能保证)会崩溃。
-
此null终止字符串。这取决于如果需要的话你想如何使用字符串。你的例子中的
printf
需要它,因为这是它知道字符串何时结束的唯一方法。 -
对不起,我没有时间仔细看。
malloc(0)
是有效的。它返回的是实现定义的。但是如果通过malloc(0)
返回的指针访问对象,则会发生undefined behavoiur
。你可以阅读这个相关的问题
在C中,由于字符串是以