我想让自定义的函数copy把字符指针*p的地址用返回指针值的函数返回到主函数赋值给 *j 但是程序正常运行了但好像没有把地址传出来,希望有人能解答一下

问题遇到的现象和发生背景

我想让自定义的函数copy把字符指针*p的地址用返回指针值的函数返回到主函数赋值给 *j 但是程序正常运行了但好像没有把地址传出来,希望有人能解答一下
程序目的:
编写一个程序,将字符串中的第m个字符开始的字符子串复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果,在被调函数中完成复制。

用代码块功能插入代码,请勿粘贴截图
#include<stdio.h>
#include<string.h>

int main()
{
    char *copy(char *s,int m);
    int m;
    char *str,*j;
    printf("Please enter a string\n");
    gets(str);
    printf("Which m do you want to convert from\n");
    scanf("%d",&m);
    j=copy(str,m);
    for(;*j!='\0';j++){
        printf("%c",*j);
    }
    
}
 char *copy(char *s,int m)
 {
     char *p;
     for(s+=(m-1);*s!='\0';s++,p++){
         *p=*s;
     }
     return(p);
 }

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果

修改如下,供参考:

#include <stdio.h>
#include <string.h>
int main()
{
    char *copy(char *s,int m);
    int m;
    char str[80],*j;  //char *str,*j; //修改
    printf("Please enter a string\n");
    gets(str);
    printf("Which m do you want to convert from\n");
    scanf("%d",&m);
    j=copy(str,m);
    for(;*j!='\0';j++){
        printf("%c",*j);
    }
    return 0;
}
char *copy(char *s,int m)
{
    char *p,*q = s;     //修改
    while(*q) q++;      //修改
    if (m > (q - s)) return q;//修改
    for(p = s, q = s + m - 1; *q!='\0'; p++,q++){//修改
         *p=*q;
    }
    *p = '\0';   //修改
    return(s);   //修改
}

我改了一下但是不知道为什么输入字符串后直接就结束了

#include<stdio.h>
#include<string.h>

int main()
{
    char copy(char *s,int m);
    int m;
    char *str;
    printf("Please enter a string\n");
    gets(str);
    printf("Which m do you want to convert from\n");
    scanf("%d",&m);
    copy(str,m);
    }
 char copy(char *s,int m)
 {
     char *p;
     for(s+=(m-1);*s!='\0';s++,p++){
         *p=*s;
     }
     puts(p);
 }

img