0

Cで簡単なカウンター構造を書きました:

typedef struct{
    int value;
}Counter;

次に、簡単な実装をいくつか書きました。

void createCounter(Counter *dCount)
{ 
    dCount = (Counter*)malloc(sizeof(Counter));
    dCount->value = 0;
}

void FreeResource(Counter *dCount)
{
  free(dCount);
}

今、主に、作成したポインターを解放したかったのですが、解放されているポインターが割り当てられていないと不平を言いました.コードを見て、createCounter()関数を呼び出したときにメモリを割り当てたと思いましたか?

 int main()
  {
    Counter m;
    CreateCounter(&m);
    FreeResource(&m); //run time error given here..

    return 0;
 }
4

3 に答える 3

4

問題はCreateCounter、変数dCountローカル変数であることです。つまり、関数が戻ったときに変数への変更は表示されません。

これには、次の 2 つの一般的な解決策があります。

  1. ポインターを返します。

    Counter *CreateCounter()
    {
        Counter *dCounter = malloc(sizeof(Counter));
        dCounter->value = 0;
        return dCounter;
    }
    
  2. 引数を参照、つまりポインタへのポインタとして渡します。

    void CreateCounter(Counter **dCounter)
    {
        *dCounter = malloc(sizeof(Counter);
        (*dCounter)->value = 0;
    }
    

    そして、次のように呼び出します。

    Counter *m;
    CreateCounter(&m);
    
于 2012-07-27T13:04:18.163 に答える
4
dCount = (Counter*)malloc(sizeof(Counter));

複数の問題があります。

  • dCount = ...つまり、ポインタは変更されません。
  • mallocすでに割り当てられている構造体へのポインターを渡しました。何もする必要はありません
  • &m取得していないもの ( ) を解放しようとしていますmalloc

この時点での唯一の賢明な提案は、ポインターに関する章を確認することです。

于 2012-07-27T13:03:12.403 に答える
4

スタックに割り当てられた変数のアドレスを渡そうとしていますが、malloc によって割り当てられたアドレスをそれに割り当てようとしていますが、呼び出し元には反映されません。したがって、それを解放しようとすると、スタック変数のアドレスを free に効果的に渡しているため、未定義の動作が発生します。

機能を変更する

void createCounter(Counter *dCount) 
{      
    dCount = (Counter*)malloc(sizeof(Counter));    
    dCount->value = 0; 
} 

なので

void createCounter(Counter **dCount) 
{      
   *dCount = (Counter*)malloc(sizeof(Counter));     
   (*dCount)->value = 0; 
} 

あなたの場合、ポインターは値で渡され、新しいメモリ アドレスの割り当ては呼び出し元に反映されません。

main 関数は次のように変更する必要があります。

int main()     
{       
  Counter *m;       
  CreateCounter(&m);       
  FreeResource(m); //run time error given here..          
  return 0;    
}   
于 2012-07-27T13:03:43.273 に答える