2011-12-08 8 views
0

ここでは、コードです: ::C4700警告:のmalloc、スコープ、初期化(またはその欠如)

// allocation 
void allocateSymbolStorage(char **pepperShakerList, char **pepperList) 
{ 
    // allocate storage for an array of pointers 
    pepperShakerList = (char **) malloc(MAX_PEPPER_SHAKERS * sizeof(char *)); 

    for (int i = 0; i < MAX_PEPPER_SHAKERS; i++) 
    { 
     if ((pepperShakerList[i] = (char *) malloc(MAX_SHAKERNAME_LENGTH * sizeof(char))) == NULL) 
      fatalError("failed pepperShakerList alloc"); 
    } 

    // allocate storage for an array of pointers 
    pepperList = (char **) malloc(MAX_PEPPERS * sizeof(char *)); 

    for (int i = 0; i < MAX_PEPPERS; i++) 
    { 
     if ((pepperList[i] = (char *) malloc(MAX_PEPPER_LENGTH * sizeof(char))) == NULL) 
      fatalError("failed pepperList alloc"); 
    } 
} 

void buildPepperShakers(void) 
{ 
    char **pepperShakerList, **pepperList; 

    allocateSymbolStorage(pepperShakerList, pepperList); 

    // .... 

    freeSymbolStorage(pepperShakerList, pepperList); 
} 

ここではVS 2010のエラーです初期化されていないローカル変数は、 'pepperList'

を使用ここでは混乱があります: char **がallocate関数で割り当てられている場合にエラーが発生するのはなぜですか?範囲外になるのは問題なのでしょうか?

+0

'symbolList'はありません。あなたは 'pepperList'を意味しますか?どのラインがエラーを投げていますか? – Borodin

+0

私の人生では、上記のコードで 'symbolList'を見つけることはできません... –

答えて

0

それはあなたが話し、AND allocationSymbolStorageでコードが何を反映していることを想定していることをpepperListなくsymbolListだと仮定すると、あなたがしたい、その後、VCは正しく不平を言っている。

buildPepperShakers()では、allocateSymbolStorageから戻ってきた値が返されないため、コードがクラッシュする可能性があります。

だからあなたallocateSymbolStorageはとして宣言する必要があります。それはTHENとして割り当てを行うことができるようにTHENあなたは、すなわちpepperListpepperShakerList割り当て関数に、buildPepperShakersでローカルポインタホルダー変数のアドレスを渡す

void allocateSymbolStorage(char ***pepperShakerList, char ***pepperList) 

TJDの回答ごとに。それは次のとおりです。もちろん

void buildPepperShakers(void) { 
     char **pepperShakerList, **pepperList; 
     allocateSymbolStorage(&pepperShakerList, &pepperList); 
} 

あなたallocateSymbolStorage本体が今になっ:

void allocateSymbolStorage(char ***pepperShakerList_p, char ***pepperList_p) 
{ 
    char **pepperShakerList, **pepperList; 
    // allocate storage for an array of pointers 
    pepperShakerList = (char **) malloc(MAX_PEPPER_SHAKERS * sizeof(char *)); 

    for (int i = 0; i < MAX_PEPPER_SHAKERS; i++) 
    { 
     if ((pepperShakerList[i] = (char *) malloc(MAX_SHAKERNAME_LENGTH * sizeof(char))) == NULL) 
      fatalError("failed pepperShakerList alloc"); 
    } 

    // allocate storage for an array of pointers 
    pepperList = (char **) malloc(MAX_PEPPERS * sizeof(char *)); 

    for (int i = 0; i < MAX_PEPPERS; i++) 
    { 
     if ((pepperList[i] = (char *) malloc(MAX_PEPPER_LENGTH * sizeof(char))) == NULL) 
      fatalError("failed pepperList alloc"); 
    } 

    *pepperShakerList_p = pepperShakerList; 
    *pepperList_p = pepperList; 

} 

、今VCは文句を言うべきではありません。これはあなたのオブジェクトのメモリ管理を行う醜い方法です:-)

+0

意図的に醜さを作成したくない場合は、これをより適切に行う方法について正しい方向に向けることができますか? (私はあなたが見ることができるように、まだ英語の専攻...まだ学んでいます。) – PaeneInsula

+0

:)素晴らしいです...あなたはすばらしいことになります!私は英語の詩の執筆を教えています。私は自分自身と言うと、überCのプログラマーです...プログラミングと詩は関連しています... –

0

これは、あなたが意図しているもので、あなたが渡すポインタを間接参照する必要があります。

*pepperShakerList = (char *) malloc(MAX_PEPPER_SHAKERS * sizeof(char *)); 
+0

これだけでは、コードでは動作しません。 –

+0

しかし、スコープの問題、コンパイラの警告 – TJD

+0

の理由を示して、私はその変更を加えたが、同じエラー。私はchar **をallocateSymbolStorage()関数に何とかして渡す必要がありますか? – PaeneInsula

関連する問題