C语言中关于地址作返回值以及printf的缓冲刷新问题
程序源码:
#includechar * itoa(unsigned int count)
{
char s[32];
char *t;
char hex[] = "0123456789ABCDEF";
int i,j=0,length = 0;
char tmp;
t = s;
while(count){
i = count % 10;
s[j] = hex[i];
j++;
count = count /10;
}
s[j] = '\0';
while(*t){
t++;
length++;
}
t--;
for(i = 0 ;i < length /2;i++){
//printf("%c==%d==%c\n",s[i],i,*t);
tmp = s[i];
s[i] = *t;
*t = tmp;
t--;
}
t = s;
printf("%s\n%s\n",t,s);
return t;
}
int main()
{
unsigned int i = 12345;
char * sh = itoa(i);
printf("%s",sh);
}
以上代码是整形转化成字符型,不要问我为什么不用c库函数,因为我写的是裸机用的,不要问我为什么不申请堆,因为我写的是裸机用的。
好上述代码的思想上是没有问题的,就是通过不断除以10取余数进行赋值,然后进行字符串的倒序。最终完成了指针t或者s,返回,调用,打印。下面是结果:
意思是说调用之前可以打印,说明字符指针是创建对了,但是调用的时候出现乱码,于是笔者进行了各种常识。最终找到错误所在。
分析如下:子函数被调用的时候,在子函数的局部变量会在函数执行之后被销毁。所以返回值是没有的。所以不会打印东西。
但是为什么还能打印一部分呢?这就涉及到另一个问题:printf的缓冲刷新问题。看下面两个程序:
程序1:
Int main()
{
Printf(“aaa”);
While(1);
}
程序2:
Int main()
{
Printf(“aaa\n”);
While(1);
}
两个程序执行结果不同,第一个没有打印aaa,第二个打印了aaa
printf只有当缓冲区满了或者加上\n或者有输入的时候才会显示到屏幕上,所以以后在使用printf的时候要加上\n