为什么在这种情况下出现细分错误?

我刚完成程序,一切都正常,但最后显示出分段错误。我知道这是由内存或指针引起的,但在我的情况下我找不到。我不知道该怎么解决。有任何想法吗? :D

这是代码的主要部分


void dynamics(char *s){
  char *p;
  printf("0.");
  puts(s);
  int k;
  int j;
  int i = 0;
  int a = 0;

    for(k=0;k<10;k++){
      a=0;
      j=0;
      for(i=0;*(s+i);i++)
        if(*(s+i)=='A')
        a++;

      p=calloc(sizeof(s)+a,1);

      for(i=0;*(s+i);i++) {

      if(*(s+i)=='A'){
          *(p+j++)='A';
          *(p+j++)='B';
          }

      if(*(s+i)=='B'){
          *(p+j++)='A';
          }  
        }
      printf("%d.", k+1);
      puts(p);
      przepisz(s, p);

    }
}

int main(){


  char algae[] = "A";

  dynamics(algae);

  return 0;
}