2017-04-05 7 views

答えて

3
int indZero = 0; 

int *perZero=NULL; 

int zero = 0;//Initialization 


ProcessBit(zero,&indZero,&perZero);// Call function 

void ProcessBit(int num,int *ind,int **mas) 

{ 

mas=(int**)realloc(&mas,((*ind))*sizeof(int));// Error 

mas[num-1]++;//it's correct line 

} 

いくつかの問題:

    realloc
  • の最初の引数は、ポインタ(又はNULL)です。

  • ProcessBitは実際には参照渡しを正しくエミュレートしません。

  • 負のインデックスを使用できます。

  • masintへのポインタですが、intへのポインタとして使用します。

A "固定" バージョン次のようなものになります、今

void ProcessBit(int num, int *ind, int **mas) 
{ 
    int *temp = realloc(*mas, (*ind + 1) * sizeof(int)); 
    if (temp == NULL) 
    { 
     // TODO: Handle error 
     // TODO: return or exit(EXIT_FAILURE) 
    } 

    *mas = temp; 

    (*mas)[*ind] = 0; // Initial initialization 

    if (num > 0) 
    { 
     (*mas)[num - 1]++; 
    } 

    ++*ind; // Increase the size 
} 

を、これは本当にC++(あなたがあなたの質問にタグ付けされる)だった場合、あなたはstd::vectorを使用する必要があります代わりに、はるかに単純なコードでほとんどすべての問題を解決します。

0

パラメータが間違っています。 NULLポインタを再割り当てしようとしているので、mallocのように動作するはずです。しかし、cstdlibで宣言されたヘッダが

void* realloc(void* ptr, std::size_t new_size); 

仮パラメータmasはすでに、ポインタのアドレスですので、コールはreallocのハンドル以来

*mas=(int*)realloc(*mas,((*ind))*sizeof(int)); 
(*mas)[num-1]++; 

ことやコピーによってポインタを返す必要があります、参照ではありません。

メモリロケーション(NULL)のアドレスが格納されているメモリロケーションのアドレスをProcessBitファンクションに、次にそのロケーションのアドレスをreallocファンクションに渡しています。この関数は、変数macが格納されているメモリをスタックに再割り当てしようとします。それが無効なポインタであることは間違いありません。

&macを渡すことで、ポインタの逆参照中に間違った方向にステップを実行しているだけです。

関連する問題