本地能通过的代码oj上为什么runtime error?

这是一段要求用指针的题目

刚学指针要用指针修改字符串中的小写字母,将其全部转化成大写。字符串的长度不大于98并且只有英文字母。
为什么会runtime error?

#include <iostream>
#include <cstring>
using namespace std;
// 写出两个函数的声明
char * funB(char * str,char** strar);
char* &funA(char ** strar);
int main() {
char a[100], b[100];
for(int i = 0; i < 3; ++i) {
char **p;
cin >> a;
funA(p) = a;
cout << funB(b, p);
}
return 0;
}
char * funB(char * str,char** strar)
{
    const int less = 'a'-'A';
    int tr = strlen(str);
    if (tr>0)
    {
        for (int i = 0;i<tr;i++) str[i] = '\0';
    }
    int len = strlen(*strar);
    for (int i = 0;i<len;i++)
    {
        if ((*strar)[i]>='a'&&(*strar)[i]<='z') str[i] = (*strar)[i]-less;
        else str[i] = (*strar)[i];
    }
    return str;
}
char* &funA(char ** strar)
{
    return *strar;
}

Run-Time Check Failure #3 - The variable 'p' is being used without being initialized.

int main() {
char a[100] = { 0 }, b[100] = {0};
    for (int i = 0; i < 3; ++i) {
        char** p = new char*;
        cin >> a;
        funA(p) = a;
        cout << funB(b, p);
    }
    return 0;
}