mallocとcalocの違い

17933 ワード

ここにカスタムディレクトリのタイトルを書きます.
  • mallocとcalocの違い
  • 総括
  • mallocとcalocの違い
    昨日はデータ構造を書いて、木の遍歴の時に殻を押さえました.何度もソースを見ても分かりませんでした.最後にmallocとcalocの違いが分かりませんでした.以下は木を遍歴する前の準備です.
    //
    // Created by shangkejie on 2020/4/13.
    //
    #ifndef LEARNTREE_MYTREE_H
    #define LEARNTREE_MYTREE_H
    #include 
    #include 
    #include 
    typedef char binTreeElemType;
    typedef struct binTree{
        binTreeElemType data;//  
        struct binTree *lchild;//        
        struct binTree *rchild;//        
    }binTree,*BinTree;
    typedef struct tag{
        BinTree p;
        struct tag *next;
    }tag,*ptag;
    //      
    #define MaxSize 50
    typedef BinTree ElemType;
    typedef struct {
        ElemType data[MaxSize];
        int top;
    }myStack;
    void initStack(myStack *stack);
    bool stackEmpty(myStack *stack);
    bool stackPush(myStack *stack,ElemType x);
    bool stackPop(myStack *stack,ElemType *x);
    bool stackGetTop(myStack *stack,ElemType *x);
    //        
    typedef struct linkNode{
        ElemType data;
        struct linkNode *linkNext;
    }linkNode;
    typedef struct {
        linkNode *front,*rear;
    }linkQueue;
    void initQueue(linkQueue *linkQueue);
    bool queueEmpty(linkQueue linkQueue);
    void enQueue(linkQueue *linkQueue,ElemType x);
    bool delQueue(linkQueue *linkQueue,ElemType *x);
    #endif //LEARNTREE_MYTREE_H
    
    
    ソースコードを分析してください
    #include "myTree.h"
    
    void PrePrint(BinTree pTree);
    
    int main() {
        BinTree treeNew;
        int i,j,pos;
        char ch;
        BinTree tree=NULL;//  
        ptag pHead=NULL,pTail=NULL,listPNew,pCur;
        //abcdefghij
        while (scanf("%c",&ch)!=EOF){
            if (ch=='
    '
    ){ break; } treeNew=(BinTree)malloc(sizeof(struct binTree)); treeNew->data=ch; listPNew=(ptag)malloc(sizeof(struct tag)); listPNew->p=treeNew; if (NULL==tree){ tree=treeNew; pHead=listPNew; pTail=listPNew; pCur=listPNew; continue; } else{ pTail->next=listPNew; pTail=listPNew; } if (NULL==pCur->p->lchild){// pCur->p->lchild=treeNew; } else if (NULL==pCur->p->rchild){// pCur->p->rchild=treeNew; pCur=pCur->next; } } printf("--------PreOrder--------
    "
    ); PrePrint(tree); printf("
    --------INOrder--------
    "
    ); printf("
    --------POSTOrder--------
    "
    ); printf("
    --------PreOrder--------
    "
    ); return 0; } void PrePrint(BinTree pTree) { if (pTree!=NULL){ printf("%c",pTree->data); //putchar(pTree->data); PrePrint(pTree->lchild); PrePrint(pTree->rchild); } }
    Debugを記録しましたが、エラーの原因を発見しました.ここで直接スキップしました.
     if (NULL==pCur->p->lchild){//     
                pCur->p->lchild=treeNew;
              
    
    なぜスキップしますか?NULLじゃないですか?百思さん、お姉さん、そして一字の正しいソースコードですか?発見がmallocの原因です.
    malloc初期化の空間はデータが付いていますが、データのランダムなものです.汚いデータと言います.
    mallocをcalocに変更してから、問題が解決されます.
      treeNew=(BinTree)calloc(1,sizeof(struct binTree));
            treeNew->data=ch;
            listPNew=(ptag)calloc(1,sizeof(struct tag));
            listPNew->p=treeNew;
    
    calocは、初期データの場合は、空間を初期値とし、int型のデータであれば0に初期化し、ポインタであればNULLに初期化する.
    以来、mallocとcalocの違いが分かりました.
    締め括りをつける
    malloc初期化の空間はデータが付いていますが、データのランダムなものです.汚いデータと言います.
    calocは、初期データの場合は、空間を初期値とし、int型のデータであれば0に初期化し、ポインタであればNULLに初期化する.