我在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声明,它就不起作用。我不知道为什么会这样,有什么解释吗?
答案 0 :(得分:1)
未定义的行为可能会导致一些非常奇怪的行为。
您正在函数cn
中返回getBase
,这是一个指向本地自动数组buffer
中某处的指针。
要解决此问题,您可以将buffer
设为静态,或使用动态分配。