Malloc printf开头有奇怪的字符

时间:2015-10-26 23:44:41

标签: c printf malloc cross-platform

我目前正在学习C并且遇到了这个奇怪的错误。奇怪的是,这个错误不会在一个编译器上发生,但确实发生在另外两个编译器上。鉴于我对malloc很新,我想也许我做了一件我不应该做的事。

以下是我遇到问题的代码:

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

const char* int_to_binary(unsigned int x)
{
    char *str = (char *) malloc(sizeof(char)*9);

    int z;
    for (z = 128; z > 0; z >>= 1)
    {
        strcat(str, ((x & z) == z) ? "1" : "0");
    }
    return str;
}

int main()
{
    printf("Testing: %s\n", int_to_binary(1));
    return 0;
}

我在linux平台上编译这个文件并得到以下输出:

测试:00000001

但是在Windows和codepad.org上的C编译器上,我得到了以下输出:

测试: 00000001

我不明白在cstring之前导致多余字符的原因。

1 个答案:

答案 0 :(得分:2)

你不能strcat()到未初始化的缓冲区,它希望它的第一个参数被nul终止。同样使用strcat()就是一个坏主意,你应该使用指针artihmetics来追加角色,nul终止str以便将其传递给printf()

char *ptr;

ptr = str;
for (z = 128 ; z > 0 ; z >>= 1, ptr++)
    *ptr = ((x & z) == z) ? '1' : '0';
*ptr = '\0';