输出的字符串是随机的,但是地址的值是也是对了的。vs2013

将整数转换成字符串
char* int2str( int i)
{
int temp = i;
int k = 0;
char buf[10];
char *str = buf;
while (temp != 0)
{
buf[k] = (temp % 10)+'0';// 字符0的asii码是49
temp = temp / 10;
k++;
}
buf[k] = 0;
return str;
}

int main(void)
{
char *pstr;

pstr=int2str(21);//调试发现这一步执行完后pstr指向的字符串已经是“12”
printf("str=%s\n", pstr);//我没有倒置,所以理论上输出出来的因该是12,但是打印出来的字符串是随机的

return 0;

}

因为你返回了一个局部变量的地址。你让str指向buf,而buf的声明周期在你调用完int2str就结束了
返回一个局部变量的地址是未定义行为,所以不同的编译器可能得到不同的结果
改成用malloc才行:

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

char* int2str(int i)
{
    int temp = i;
    int k = 0;
    char *buf = (char *)malloc(sizeof(char) * 10);
    char *str = buf;
    while (temp != 0)
    {
        buf[k] = (temp % 10) + '0';// 字符0的asii码是49
        temp = temp / 10;
        k++;
    }
    buf[k] = 0;
    return str;
}


int main(void)
{
    char *pstr;

    pstr = int2str(21);//调试发现这一步执行完后pstr指向的字符串已经是“12”
        printf("str=%s\n", pstr);//我没有倒置,所以理论上输出出来的因该是12,但是打印出来的字符串是随机的

    return 0;
}

图片说明