转换基数时,C中有趣的printf()故障

时间:2015-04-29 02:07:09

标签: c

我在C中有以下代码:

char* getBase(unsigned int a, int base) {
    char buffer[33];

    char digits[] = "0123456789ABCDEF";

    if(base < 2 || base > 16) {
        printf("Invalid base");
        return NULL;
    }

    char* cn = &buffer[sizeof(buffer) - 1];
    *cn = '\0';

    do {
        cn -= 1;
        *cn = digits[a % base];
        a /= base;
    } while(a > 0);

    printf("\n"); //HERE

    return cn;
}

int main() {
    printf("%s", getBase(8, 2));
    return 0;
}

如您所见,它需要一个基数为10的数字,并将其转换为基数2和基数16之间的数字。除非我注释掉标有//HERE的行,否则它将起作用。出于某种原因,如果我没有这个printf声明,它就不起作用。我不知道为什么会这样,有什么解释吗?

1 个答案:

答案 0 :(得分:1)

未定义的行为可能会导致一些非常奇怪的行为。

您正在函数cn中返回getBase,这是一个指向本地自动数组buffer中某处的指针。

要解决此问题,您可以将buffer设为静态,或使用动态分配。