我用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语句,它就不能工作。我不知道为什么会这样,有什么解释吗?
发布于 2015-04-29 02:10:45
未定义的行为可能会导致一些非常奇怪的行为。
您将在函数getBase
中返回cn
,这是一个指向本地自动数组buffer
中某处的指针。
要解决此问题,您可以将buffer
设为静态,或使用动态分配。
https://stackoverflow.com/questions/29933107
复制相似问题