mallocとcalocの違い
17933 ワード
ここにカスタムディレクトリのタイトルを書きます. mallocとcalocの違い 総括 mallocとcalocの違い
昨日はデータ構造を書いて、木の遍歴の時に殻を押さえました.何度もソースを見ても分かりませんでした.最後にmallocとcalocの違いが分かりませんでした.以下は木を遍歴する前の準備です.
malloc初期化の空間はデータが付いていますが、データのランダムなものです.汚いデータと言います.
mallocをcalocに変更してから、問題が解決されます.
以来、mallocとcalocの違いが分かりました.
締め括りをつける
malloc初期化の空間はデータが付いていますが、データのランダムなものです.汚いデータと言います.
calocは、初期データの場合は、空間を初期値とし、int型のデータであれば0に初期化し、ポインタであればNULLに初期化する.
昨日はデータ構造を書いて、木の遍歴の時に殻を押さえました.何度もソースを見ても分かりませんでした.最後に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に初期化する.