-3
我一直在學習數據結構與算法C和chaning一個結構的元素Ç - Changint一個結構的元素的順序導致分段故障
這裏的訂單時,我只是有一個問題我lib.h文件:
typedef struct ElementType
{
int id;
char name[20];
} ElementType;
typedef struct Node
{
ElementType data;
struct Node* left;
struct Node* right;
} Node;
Node* insert(Node** tree, ElementType e)
{
if((*tree) == NULL)
{
(*tree)=(Node*)malloc(sizeof(Node));
(*tree)->data = e;
(*tree)->left = NULL;
(*tree)->right = NULL;
return (*tree);
}
else if ((*tree)->data.id == e.id)
return (*tree);
else if (e.id < (*tree)->data.id)
return insert(&((*tree)->left), e);
else
return insert(&((*tree)->right), e);
}
void freeTree(Node* tree)
{
if((tree) == NULL)
return;
else
{
freeTree(tree->left);
freeTree(tree->right);
free(tree);
}
}
void inorder(Node* tree)
{
if(tree!=NULL)
{
inorder(tree->left);
printf("%d - %s\n", tree->data.id, tree->data.name);
printf("This node : %p\n", tree);
printf("This data : %p\n", &(tree->data));
printf("This left : %p\n", tree->left);
printf("This right : %p\n", tree->right);
inorder(tree->right);
}
}
void init(Node** tree)
{
(*tree) = NULL;
}
這是我的主文件中包含上述的lib
ElementType makeNewElem(int a, char* b)
{
ElementType e;
e.id = a;
strcpy(e.name, b);
return e;
}
int main() {
Node* root;
init(&root);
ElementType a = makeNewElem(5, "A");
ElementType b = makeNewElem(6, "B");
ElementType c = makeNewElem(7, "C");
insert(&root, a);
insert(&root, b);
insert(&root, c);
inorder(root);
printf("\n");
freeTree(root);
inorder(root);
return 0;
}
這是我編譯後的結果
5 - A
This node : 0x1671010
This data : 0x1671010
This left : (nil)
This right : 0x1671040
6 - B
This node : 0x1671040
This data : 0x1671040
This left : (nil)
This right : 0x1671070
7 - C
This node : 0x1671070
This data : 0x1671070
This left : (nil)
This right : (nil)
23531568 -
This node : 0x1671010
This data : 0x1671010
This left : (nil)
This right : 0x1671040
23531616 -
This node : 0x1671040
This data : 0x1671040
This left : (nil)
This right : 0x1671070
0 -
This node : 0x1671070
This data : 0x1671070
This left : (nil)
This right : (nil)
然後我後移動線 「的ElementType數據;」
typedef struct Node
{
struct Node* left;
struct Node* right;
ElementType data;
} Node;
控制檯>>
5 - A
This node : 0x1226010
This data : 0x1226020
This left : (nil)
This right : 0x1226040
6 - B
This node : 0x1226040
This data : 0x1226050
This left : (nil)
This right : 0x1226070
7 - C
This node : 0x1226070
This data : 0x1226080
This left : (nil)
This right : (nil)
Segmentation fault (core dumped)
有人能幫助我解釋爲什麼 之前1.我改變了代碼,爲什麼它仍然打印出數據的價值(我雖然該節點將是NULL在被釋放後!?) 2.我更改了代碼之後,爲什麼我的核心轉儲?
我爲我長的問題,我的英語不好所以對不起!
[請參閱此討論,爲什麼不在C中拋出malloc()和family的返回值..](https://stackoverflow.com/q/605845/2173917) –
未定義的行爲未定義。 – melpomene
更改結構成員的順序應該對正確的程序沒有影響。如果它導致錯誤,那麼程序中的某處可能有未定義的行爲。使用調試器來瀏覽程序,以查看事情何時出錯。 – Barmar