こんにちは。
KETA=3、a=12, b=2でやってみましたら、c=24と適切な結果を得ることができました。
これらは正しく作動するものとします。(というかしています。)
 
本当に正しく動作していますでしょうか? 
下記は入力と出力に同じ領域を指定していますが、そのような使い方でも正しく動作することを確認されてますか?
mulBy10(&d,&d); 
add(c,&d,c);
 
しかし、インプレース処理を考慮してなくても、結果が0になることはあまりないです。 
signについては確認されているようなので、coco_bauerさんの指摘が当たっていると言うことはないとは思うのですが...
 
【追記】 
動作確認したソースを上げておきます。 
NUMBERとmultipleの内容は修正していません。
C++
1 # include   <iostream> 
 2 
3 # define   KETA   3 
 4 
5 struct   NUMBER  
 6 {  
 7    int  n [ KETA ] ; /*KETA個の桁*/  
 8    int  sign ; /*符号、正なら1、負なら-1*/  
 9 } ;  
 10 
11 void   clearByZero ( struct   NUMBER   * c ) 
 12 { 
 13      for   ( int  i = 0 ;  i  <  KETA ;   ++ i ) 
 14         c -> n [ i ] = 0 ; 
 15     c -> sign = 0 ; 
 16 } 
 17 void   mulBy10 ( struct   NUMBER   * a ,   struct   NUMBER   * b ) 
 18 { 
 19      for   ( int  i = KETA - 1 ;   0   <  i ;   -- i ) 
 20         b -> n [ i ] = a -> n [ i - 1 ] ; 
 21 } 
 22 void   add ( struct   NUMBER   * a ,   struct   NUMBER   * b ,   struct   NUMBER   * c ) 
 23 { 
 24      int  h = 0 ; 
 25      for   ( int  i = 0 ;  i  <  KETA ;   ++ i ) 
 26      { 
 27          int  x = a -> n [ i ] + b -> n [ i ] + h ; 
 28         c -> n [ i ] = x % 10 ; 
 29         h = x / 10 ; 
 30      } 
 31 } 
 32 
33 void   print ( char   const *  t ,   struct   NUMBER   * a ) 
 34 { 
 35 	std :: cout  <<  t ; 
 36      if   ( a -> sign  >   0 )   { 
 37         std :: cout  <<   "+ " ; 
 38      }   else   if   ( a -> sign  <   0 )   { 
 39         std :: cout  <<   "- " ; 
 40      }   else   { 
 41         std :: cout  <<   "  " ; 
 42 	 } 
 43      for   ( int  i = KETA - 1 ;   0   <=  i ;   -- i ) 
 44         std :: cout  <<  a -> n [ i ]   <<   " " ; 
 45     std :: cout  <<   "\n" ; 
 46 } 
 47 
48 int   multiple ( struct   NUMBER   * a , struct   NUMBER   * b , struct   NUMBER   * c )  
 49 {  
 50    struct   NUMBER  d ;  
 51    int  asign = a -> sign ;  
 52    int  bsign = b -> sign ;  
 53    int  i , j ;  
 54    int  h = 0 ;  
 55    int  x ; 
 56 
57    clearByZero ( c ) ; 
 58 
59   a -> sign = 1 ;  
 60   b -> sign = 1 ; 
 61 
62    for ( i = 0 ; i < KETA - 1 ; i ++ )  
 63    {  
 64      for ( j = 0 ; j < KETA ; j ++ )  
 65      {  
 66       d . n [ j ] = ( ( a -> n [ j ] * b -> n [ i ] ) + h ) % 10 ;  
 67       h = ( ( a -> n [ j ] * b -> n [ i ] ) + h ) / 10 ;  
 68      }  
 69      for ( x = i ; x > 0 ; x -- )  
 70      {  
 71        mulBy10 ( & d , & d ) ;  
 72      }  
 73      add ( c , & d , c ) ;  
 74    } 
 75 
76    if ( asign == bsign )  
 77    {  
 78     c -> sign = 1 ;  
 79    }  
 80    else  
 81    {  
 82     c -> sign = - 1 ;  
 83    }  
 84    return   ( 0 ) ;  
 85 } 
 86 
87 int   main ( ) 
 88 { 
 89     NUMBER a = { { 2 , 1 , 0 } , 1 } ; 
 90     NUMBER b = { { 2 , 0 , 0 } , 1 } ; 
 91     NUMBER c ; 
 92      clearByZero ( & c ) ; 
 93 
94      print ( "a=" ,   & a ) ; 
 95      print ( "b=" ,   & b ) ; 
 96      print ( "c=" ,   & c ) ; 
 97      multiple ( & a ,   & b ,   & c ) ; 
 98 	std :: cout  <<   "\n" ; 
 99      print ( "c=" ,   & c ) ; 
 100 
101      return   0 ; 
 102 } 
 
MinGW 5.2.0とmsvc 2015で下記のように出力されます。
a=+ 0 1 2
b=+ 0 0 2
c=  0 0 0
c=+ 0 2 4
 
コピペ+やっつけなので、変数名等は適当です。