有如下一个静态结构体数组,占有内存太大,想改为动态分配内存的,不知咋改?
typedef struct {
int status; //状态
char hzcftab[10]; //繁体汉字部分
char jxmtab[20]; //简拼部分
char hzctab[50]; //简体汉字词
char pytab[80]; //拼音汉字码
char pywbtab[80]; //拼音58码
           } KYTAB; //字词典KYTAB  Kytab[26][10000]={0}; //字典
void LoadHZCDictionary( LPTSTR lpStr,BOOL dickind)
{
int wPYHead=0;
static int i=0,nPre=0;
UINT j,k;
int sflag=0;
char szPY[80],szHZ[50],szJXM[20],szFHZ[10],szPYWB[80];
    char *p;  //

    p=*Kytab;  //指针指向数组首地址 switch(dickind)
{
case 1:
 
for(j=0,k=0;j<strlen(lpStr);j++)//按间隔号*读入词典文件
{
if(*(lpStr+j)=='*') 
{
switch(sflag)
{
case 0: szHZ[k]=_T('\0'); break;
case 1: szPYWB[k]=_T('\0'); break;
case 2: szPY[k]=_T('\0'); break;
}
sflag++;
k=0;
}
else 
{
if(sflag==0) szHZ[k++]=*(lpStr+j);
if(sflag==1) szPYWB[k++]=*(lpStr+j);
if(sflag==2) szPY[k++]=*(lpStr+j);
if(sflag==3) szJXM[k++]=*(lpStr+j);
}
}
szJXM[k]=_T('\0'); 
// _stscanf(lpStr,"%s %s %s %s",szHZ,szPYWB,szPY,szJXM);
break;
case 0: //读入字典
sflag=0;
for(j=0,k=0;j<strlen(lpStr);j++)
{

if(*(lpStr+j)=='*') 
{
switch(sflag)
{
case 0: szHZ[k]=_T('\0'); break;
case 1: szPYWB[k]=_T('\0'); break;

case 2: szPY[k]=_T('\0'); break;
case 3: szJXM[k]=_T('\0'); break;
default: break;
}
sflag++;
k=0;
}
else 
{

if(sflag==0) szHZ[k++]=*(lpStr+j);
if(sflag==1) szPYWB[k++]=*(lpStr+j);
if(sflag==2) szPY[k++]=*(lpStr+j);
if(sflag==3) szJXM[k++]=*(lpStr+j);
if(sflag==4) szFHZ[k++]=*(lpStr+j);
}
}
szFHZ[k]=_T('\0'); 
//_stscanf(lpStr,"%s*%s*%s*%s*%s",szHZ,szPYWB,szPY,szJXM,szFHZ);
break;
default:
break;
}
wPYHead=tolower(szPY[0]) - 'a';
if(wPYHead != nPre)
    {    Dicnumber[nPre]=i;
i=Dicnumber[wPYHead];
}
//将读入的信息存到字典中
    
if (_tcslen(szHZ)<=2)
 {
                        strcpy(Kytab[wPYHead][i].pytab,szPY);
                     strcpy(Kytab[wPYHead][i].hzctab,szHZ);
                strcpy(Kytab[wPYHead][i].jxmtab,szJXM);
                     strcpy(Kytab[wPYHead][i].pywbtab,szPYWB);
}
         else
{
     if (_tcslen(szHZ)==4)
 {
   strcpy(Kytab[wPYHead][i].CYpytab,szPY);
       strcpy(Kytab[wPYHead][i].CYhzctab,szHZ);
       strcpy(Kytab[wPYHead][i].CYjxmtab,szJXM);
       strcpy(Kytab[wPYHead][i].CYpywbtab,szPYWB);    
 }
 if (_tcslen(szHZ)==6)
 {
   strcpy(Kytab[wPYHead][i].CYpytabS,szPY);
       strcpy(Kytab[wPYHead][i].CYhzctabS,szHZ);
       strcpy(Kytab[wPYHead][i].CYjxmtabS,szJXM);
       strcpy(Kytab[wPYHead][i].CYpywbtabS,szPYWB);      
 }
 if (_tcslen(szHZ)==8)
 {
   strcpy(Kytab[wPYHead][i].CYpytabSS,szPY);
       strcpy(Kytab[wPYHead][i].CYhzctabSS,szHZ);
       strcpy(Kytab[wPYHead][i].CYjxmtabSS,szJXM);
       strcpy(Kytab[wPYHead][i].CYpywbtabSS,szPYWB);
   
 }
 if (_tcslen(szHZ)>8)
 {
   strcpy(Kytab[wPYHead][i].CYpytabWYS,szPY);
       strcpy(Kytab[wPYHead][i].CYhzctabWYS,szHZ);
       strcpy(Kytab[wPYHead][i].CYjxmtabWYS,szJXM);
       strcpy(Kytab[wPYHead][i].CYpywbtabWYS,szPYWB);
 }
} if(dickind==0)
strcpy(Kytab[wPYHead][i].hzcftab,szFHZ);
Kytab[wPYHead][i].status=1;
nPre=wPYHead;
i++;
return;
}

解决方案 »

  1.   

    #include <afxtempl.h>
    typedef struct {
    CString StrNumber;
    int Duration;
    int Degree;
    int International;
    int GAT;
    int Inside;
    int City;
    int Total;
    CString Type;
    CString Address;
    } pData;//链表所存结构
    CTypedPtrArray<CPtrArray, pData*> m_dataList;//链表 da=new pData;
    da->StrNumber=strNumber;
    da->Duration=0;
    da->Degree=0;
    da->International=0;
    da->GAT=0;
    da->Inside=0;
    da->City=0;
    da->Total=0;
    da->Type=strType;
    da->Address=strLocation;
    m_dataList.Add(da);
      

  2.   

    m_dataList[0]->Total = 100;
      

  3.   

    struct XXX{
    int status; //状态
    char hzcftab[10]; //繁体汉字部分
    char jxmtab[20]; //简拼部分
    char hzctab[50]; //简体汉字词
    char pytab[80]; //拼音汉字码
    char pywbtab[80]; //拼音58码
               } *table; //字词典使用的时候,
    table= new XXX[100];使用完要
    delete []table;
    table = NULL;
      

  4.   

    这样可以吗?
    KYTAB **ppKytab = new KYTAB*[26];
    for(int i=0;i<26;i++)
    {
    ppKytab[i] = new KYTAB[1000];
    }
      

  5.   

    是那二维数组太大了吗?用 vector<vector<int> > vecInt(m, vector<int>(n));  ?或者
     int **p = new int*[num1];
     for(int i=0; i<num1; ++i)
      p[i] = new int[num2];
    这个要释放
     for(int m=0;m<num1;m++)
      delete[] p[m];
     delete[] p;
      

  6.   

    KYTAB  Kytab[26][10000]={0}; //字典???????KYTAB** ppKyTab= NULL;
    //new
    ppKyTab=(KYTAB**)new BYTE[26*sizeof(KYTAB*)];
    if(NULL!==ppKyTab)
    {
    for(int index=0;index<26;++index)
    ppKyTab[index]=new KYTAB[10000];
    }//delete
    for(int index=0;index<26;++index)
    delete[] ppKyTab[index];delete ppKeyTab;
      

  7.   

    做成文件然后用map 文件可以吗?
      

  8.   

    yanzheng:   我的可是一个结构体数组,结构体元素还是数组,不是链表呀,能不能用结构体数组,动态分配的办法