C语言中十进制数到二进制数的转换

C语言中十进制数到二进制数的转换,c,malloc,C,Malloc,我试图将十进制数从[0255]转换为8位二进制数,其中每个位用逗号和空格分隔。我尝试了以下方法(最终成功了,除了最后一位不需要任何分隔符): #包括 #包括 char*atobin(int输入){ char*str=malloc(0); 整数索引,计数=0; 如果(输入>255 |输入=0;索引--){ *(str+(count++)=(输入>>索引和1)?“1”:“0”; *(str+(count++)=','; *(str+(count+)=''; } *(str+count)='\0';

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

#包括
#包括
char*atobin(int输入){
char*str=malloc(0);
整数索引,计数=0;
如果(输入>255 |输入<0){
printf(“输入超出范围。中止。\n”);
退出(退出失败);
}
对于(索引=7;索引>=0;索引--){
*(str+(count++)=(输入>>索引和1)?“1”:“0”;
*(str+(count++)=',';
*(str+(count+)='';
}
*(str+count)='\0';
返回str;
}
int main(int argc,char*argv[]){
printf(“%s\n”,atobin(atoi(argv[1]));
返回退出成功;
}
现在我有几个问题:

  • 我使用了
    malloc(0)
    ;就我而言,它会的 不从堆中分配内存。那么,它是如何/为什么工作的
  • 是声明
    *(str+count)='\0'必要吗
  • 有没有办法优化这段代码
  • 更新

    为了进行这个实验,我将
    atobin
    函数放入
    .h
    文件中。这一次会产生一些问题。 现在我补充最后一个问题:

    用于
    malloc
    参数的最小整数应该是多少?一些反复试验的方法让我猜它应该是我的
    512
    。有什么想法吗

  • 从malloc文档:
  • 如果大小为零,则返回值取决于特定的库实现(它可能是空指针,也可能不是空指针),但不应取消对返回指针的引用


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

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

  • 对不起,我没有时间仔细看看

  • 从malloc文档:
  • 如果大小为零,则返回值取决于特定的库实现(它可能是空指针,也可能不是空指针),但不应取消对返回指针的引用


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

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

  • 对不起,我没有时间仔细看看

  • malloc(0)
    有效。它返回的是实现定义的。但是,如果通过malloc(0)
    返回的指针访问对象,会发生什么情况呢。您可以阅读相关问题。
    在C语言中,由于字符串是以
    \0
    结尾的字符数组,因此最好使用
    *(str+count)='\0'语句设置字符串的最后一个字符。它在这段代码中工作,但最好总是在代码中设置字符串的结尾。如果位设置为0,它可能会工作,因为它与终止字符串相同。

    malloc(0)
    可以有效使用。它返回的是实现定义的。但是,如果通过malloc(0)
    返回的指针访问对象,会发生什么情况呢。您可以阅读相关问题。

    在C语言中,由于字符串是以
    \0
    结尾的字符数组,因此最好使用
    *(str+count)='\0'语句设置字符串的最后一个字符。它在这段代码中工作,但最好总是在代码中设置字符串的结尾。如果位设置为0,它可能会起作用,因为它与终止字符串相同。

    您知道C/C++中的“未定义行为”概念吗?@GrijeshChauhan No.:-(请参见
    str=malloc(0)
    通过执行
    *(str+(count++)几乎与
    str=NULL
    )=',';
    您正在访问/分配非法内存指令的内存。根据C标准,代码的行为是未定义的。这意味着您可能在不同的执行实例中出现意外行为。确定。这取决于您需要的内存量。一个字符可以有1个字节,也可以根据需要有更多。例如如果你不使用
    的内部优化思想,你的程序可能有24个字节:
    静态字符str[]=“0,0,0,0,0,0”;
    然后只需设置
    str[0]
    str[3]
    ,…你知道C/C++中的“未定义行为”概念吗?@grijeshchauchan No.:-(参见
    str=malloc(0)
    通过执行
    *(str+(count++))几乎与
    str=NULL
    相同=',';
    您正在访问/分配非法内存指令的内存。根据C标准,代码的行为是未定义的。这意味着您可能在不同的执行实例中出现意外行为。确定。这取决于您需要的内存量。一个字符可以有1个字节,也可以根据需要有更多。例如如果你不使用
    的内部优化思想,你的程序可能有24个字节:
    静态字符str[]=“0,0,0,0,0,0,0”;
    然后只需设置
    str[0]
    str[3]
    ,…“它对你有用只是运气而已。”-->“不幸的”因为它让OP觉得这是一个正确的代码。“它对您有效只是运气。”-->“不幸”是因为它给OP留下了这样一个印象,即这是一个正确的代码。
    #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;
    }