C程序"0x004013e7"指令引用"0x00000000"内存。该内存不能为"read"解决思路

C程序"0x004013e7"指令引用"0x00000000"内存。该内存不能为"read"
求大神帮助,急啊。

程序"0x004013e7"指令引用"0x00000000"内存。该内存不能为"read"

#include <stdio.h>

#include <math.h>
#include <stdlib.h>
float shuju[101]={0.0f};
float A_B(float pp);
void main()
{
int ii;
float pp=0.0f;
for(ii=0;ii<100;ii++)
{
pp=pp+0.01f;
shuju[ii]=A_B(pp);

}
for(ii=0;ii<=100;ii++)
{
printf("%d",ii);
printf("-----");
printf("%d\n",shuju[ii]);
}
}


float A_B(float pp)

register int i,j;
  register int k;
  int N,M;//行,列
  float *p=NULL;
  float *q=NULL;
  float *d=NULL;
  float *a=NULL;
  float *s=NULL; //s数组为各行概率累加求和
  float **p_yx=NULL; //二维数组p_yx存放信道矩阵
  float C,b,u,max,IL,IU; //C为信道容量,b为迭代精度
// printf("输入信源符号X的个数N="); //输入行列
// scanf("%d",&N);
// printf("输出信源符号Y的个数M=");
// scanf("%d",&M);
  p=(float *)calloc(N,sizeof(float)); //初始化需要用到的数组
  q=(float *)calloc(M,sizeof(float));
  d=(float *)calloc(N,sizeof(float));
  a=(float *)calloc(N,sizeof(float));
  s=(float *)calloc(N,sizeof(float));
  p_yx=(float **)calloc(N,sizeof(float));
  for(i=0;i<N;i++)
{
  p_yx[i]=(float *)calloc(M,sizeof(float));
}
p_yx[0][0]=1.0f;
p_yx[0][1]=0.0f;
p_yx[1][0]=pp;
p_yx[1][1]=1-pp;
/* printf("请输入信道矩阵:\n"); //输入信道矩阵
  for(i=0;i<N;i++)
{
  for(j=0;j<M;j++)
{
  printf("p_yx[%d][%d]=",i,j);
  scanf("%f",&p_yx[i][j]); 
}
  printf("\n");
}
*/
b=0.0001f;
/* for(i=0;i<N;i++) //判断输入的信道矩阵是否符合概率分布
{
  s[i]=0.0;
  for(j=0;j<M;j++)
  s[i]=s[i]+p_yx[i][j];
}
  for(i=0;i<N;i++) 
{
  if(s[i]<=0.999999||s[i]>=1.000001) 
  printf("不符合概率分布");
  else
  if(s[N-1]>=0.999999&&s[N-1]<1.000001)
{
  printf("请输入迭代精度:");
  scanf("%f",&b);
}
  break;
}
*/
  for(i=0;i<N;i++) //取初始概率为均匀分布
  p[i]=1.0f/N;
  for(j=0;j<M;j++) //计算q[j]
{
  q[j]=0;
  for (i=0;i<N;i++)
  q[j]=q[j]+p[i]*p_yx[i][j];
}
  for(i=0;i<N;i++) //计算a[i]
{
  d[i]=0;
  for(j=0;j<M;j++)
{
  if(p_yx[i][j]==0)
  d[i]=d[i]+0;
  else
  d[i]=d[i]+p_yx[i][j]*log(p_yx[i][j]/q[j]);

  a[i]=exp(d[i]);
}
  u=0.0;
  for(i=0;i<N;i++) //计算u
  u=u+p[i]*a[i];
  IL=log(u)/log(2.0); //计算IL
  max=a[0];  
  for(i=0;i<N;i++)
{
  if(a[i]>=max)
  max=a[i];
}
  IU=log(max)/log(2.0); //计算IU
  k=1;
  C=IL;
  while((IU-IL)>=b)//迭代计算
{
  for(i=0;i<N;i++)
  p[i]=p[i]*a[i]/u;
  for(j=0;j<M;j++) //计算q[j]
{
  q[j]=0;
  for (i=0;i<N;i++)
  q[j]=q[j]+p[i]*p_yx[i][j];
}