注意堆栈的大小是有限的,不能做太多次数的递归调用。有可能的话,用递推代替递归操作。

解决方案 »

  1.   

    有两个错误:
    1。char * cPrint[64];这是申明了指针,并没有分配内存,做
    wsprintf(cPrint[iLine],"From %i to %i move the %i",iA,iC,iS);
    时是非法的。
    2。当 iS = 10;时,iLine =1023;所以错作越界;
    正确的代码如下:
    #include "stdafx.h"
    char*  cPrint[1024];
    int iLine;void make(int iA,int iB,int iC,int iS);
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    void ma()
    {
    for(int i =0;i<1024;i++)
       cPrint[i] = new char[30];
        make(1,2,3,10);
    }
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("HelloWin") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;     if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
         
         hwnd = CreateWindow (szAppName,                  // window class name
                              TEXT ("The Hello Program"), // window caption
                              WS_OVERLAPPEDWINDOW,        // window style
                              CW_USEDEFAULT,              // initial x position
                              CW_USEDEFAULT,              // initial y position
                              CW_USEDEFAULT,              // initial x size
                              CW_USEDEFAULT,              // initial y size
                              NULL,                       // parent window handle
                              NULL,                       // window menu handle
                              hInstance,                  // program instance handle
                              NULL) ;                     // creation parameters
         
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
         
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         HDC         hdc ;
         PAINTSTRUCT ps ;
         RECT        rect ;
         int         i;
         switch (message)
         {
         case WM_CREATE:
              ma();
              return 0 ;
              
         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
              
              GetClientRect (hwnd, &rect) ;
              
              for (i=0;i<iLine;i++)
              {
                  TextOut(hdc,0,i*20,cPrint[i],lstrlen(cPrint[i]));
              }
              
              EndPaint (hwnd, &ps) ;
              return 0 ;
              
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }void make(int iA,int iB,int iC,int iS){    if (iS==0)
            return;
        make(iA,iC,iB,iS-1);    iLine++;    wsprintf(cPrint[iLine],"From %i to %i move the %i",iA,iC,iS);    make(iB,iA,iC,iS-1);}