我试图将小数从[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;
}
现在我有几个问题:
malloc(0)
;就我而言,它会
从堆中分配没有内存。那么,它是如何/为什么有效?*(str + count) = '\0';
是否必要?更新
要继续此实验,我已将atobin
函数放入.h
文件中。这次它会产生一些问题。
现在我添加我的最后一个问题:
malloc
的参数应该使用什么最小整数?一些反复试验的方法让我觉得我应该512
。有什么想法吗?
答案 0 :(得分:2)
如果size为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用。
它对你有用只是运气。尝试一些随机的malloc并随后免费,你很有可能 - 但不能保证 - 你会崩溃。
此null终止字符串。如果需要,取决于您希望如何使用字符串。您示例中的printf
需要它,因为这是了解字符串何时结束的唯一方法。
对不起,我没有时间仔细看看。
答案 1 :(得分:2)
malloc(0)
有效使用。它返回的是实现定义。但是,如果通过malloc(0)
返回的指针访问对象,则会发生什么?undefined behavoiur
。您可以阅读this相关问题
在C中,因为字符串是由\0
终止的字符数组,所以最好使用*(str + count) = '\0';
语句来设置字符串的最后一个字符。它正在使用此代码,但最好始终在代码中设置字符串的结尾。如果位设置为0,它可能有效,因为它与终止字符串相同。