C语言简单指针问题 自定义函数里面能输出正确结果 主函数输出却乱码

pta练习

函数代码如下

题目给出的主函数:
#include <stdio.h>
#include <string.h>
void fun(char *pstr,int n,char b);
int main()
{
char str[20],b[20];
int m;
gets(str);
scanf("%d",&m);
fun(str,m,b);
printf("%s",b);
return 0;
}
/
下面是我的答案 */
void fun(char *pstr,int n,char *b)
{
int m =strlen (pstr);
b=pstr+n;

strncpy(b+(m-n),pstr,n);
b[m]='\0';

}

输入样例:

在这里给出一组输入。例如:

abcefg
2
输出样例:
在这里给出相应的输出。例如:
cefgab

运行结果及报错内容

@;F=()//这一部分,即正常编译结果每次都不一样

我的解答思路和尝试过的方法

各种方式验证过 总是乱码

我想要达到的结果

各位能够指出一下问题在哪 很多道题都是这样的错误 我就选了一个比较简单的让大家帮我看看 谢谢

类似的题目就能通过

img

修改处见注释,供参考:

#include <stdio.h>
#include <string.h>
void fun(char *pstr,int n,char* b);
int main()
{
    char str[20],b[20];
    int m;
    gets(str);
    scanf("%d",&m);
    fun(str,m,b);
    printf("%s",b);
    system("pause");
    return 0;
}
// 下面是我的答案
void fun(char *pstr,int n,char* b)
{
    int m =strlen (pstr);
    //b=pstr+n; 修改 这里只改变了 b 的指向
    strncpy(b,pstr+n,m-n);
    strncpy(b+(m-n),pstr,n);
    b[m]='\0';
    //printf ("%s\n",b);  //这个是我添加在里面来验证是否得到正确结果
}

void fun(char *pstr,int n,char *b)
{
    int m = strlen (pstr);
    *b=*pstr;
    int i;
    for(i = 0; i < m; ++i){
        b[(i-n+m)%m] = pstr[i];
    }
}