[问题] segmentation fault产生原因

楼主: ptt0720 (湿湿)   2017-06-26 16:29:35
开发平台(Platform): (Ex: Win10, Linux, ...)
MacOS
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
在macOS一直出现segmentation fault(数字越来越大)
在win10结果错误1232367
在Linux正确无误1245367
喂入的资料(Input):
预期的正确结果(Expected Output):
124532
错误结果(Wrong Output):
[1] 2658 segmentation fault
>./a.out
[1] 2710 segmentation fault
>./a.out
程式码(Code):(请善用置底文网页, 记得排版)
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
struct Node *_child;
struct Node *_child2;
};
struct Node *creatTree(){
struct Node *_node = (struct Node*)malloc(sizeof(struct Node));
struct Node *_node = (struct Node*)malloc(sizeof(struct Node));
struct Node *_node2 = (struct Node*)malloc(sizeof(struct Node));
struct Node *_node3 = (struct Node*)malloc(sizeof(struct Node));
struct Node *_node4 = (struct Node*)malloc(sizeof(struct Node));
struct Node *_node5 = (struct Node*)malloc(sizeof(struct Node));
struct Node *_node6 = (struct Node*)malloc(sizeof(struct Node));
struct Node *_node7 = (struct Node*)malloc(sizeof(struct Node));
_node -> data =1;
_node2 -> data =2;
_node3 -> data =3;
_node4 -> data =4;
_node5 -> data =5;
_node6 -> data =6;
_node7 -> data =7;
_node -> _child =_node2;
_node -> _child2=_node3;
_node2 -> _child =_node4;
_node2 -> _child2=_node5;
_node3 -> _child =_node6;
_node3 -> _child =_node6;
_node3 -> _child2=_node7;
return _node;
}
void printAll_DFS(struct Node* node){
if(node!=NULL){
printf("%d",node->data);
if(node->_child!=NULL){
printAll_DFS(node -> _child);
}
if(node->_child2!=NULL){
printAll_DFS(node -> _child2);
}
}
}
int main(){
struct Node * tmp = NULL;
tmp = creatTree();
printAll_DFS(tmp);
printf("\n");
}
楼主: ptt0720 (湿湿)   2017-06-26 16:31:00
补充一下 这是在做完整二元树的走访 用DFS
作者: Hazukashiine (私は幸せです)   2017-06-26 16:35:00
我刚刚在linux上测:1245367你的 _node[4-7] 的 _child(2) 没有 initialize把 malloc 改成 calloc 试试
楼主: ptt0720 (湿湿)   2017-06-26 16:57:00
1245367无误 我改正了 请问初始化哪边呢初始化成null吗成功了 非常感谢 请问windows系统没报错console也错有人知道原因吗
作者: Hazukashiine (私は幸せです)   2017-06-26 17:29:00
初始化为 null 这个 scenario compiler 不太容易侦测出 "use uninitialize values" 所以要用其他的工具像是一些动态分析器null -> NULL uninitialize -> ~d虽然我不确定用 calloc 取代 assign to NULL 有没有符合语言标准 但是我的经验这样做基本上没问题https://stackoverflow.com/questions/29800636
作者: MIKEmike07 (加油!)   2017-06-26 17:49:00
Use Valgrind 测测看
作者: hunandy14 (Charlott.HonG)   2017-06-27 01:16:00
请问~是直接设0就好吗 calloc(sizeof(Node), 0);
作者: Bencrie   2017-06-27 09:26:00
读手册
作者: hunandy14 (Charlott.HonG)   2017-06-28 20:14:00
看一下,误会用法了...已为像是 new T(value);
作者: TobyH4cker (Toby (我要当好人))   2017-07-03 04:39:00
写一个createNode做申请跟初值化解决
作者: kevin85421 (安安)   2017-07-11 10:57:00
struct中的pointer若是没有初始化则address pointer中存的address会跑掉,所以我一直很佩服可以不用class来maintain一个大型的project的人
作者: dou0228 (7777)   2017-07-12 09:41:00
struct 写的好,是可以非常类似 class 的楼上讲的,看一下 Linux Kernel,只用 C 写那不叫做 pointer address 跑掉,要记得自行 initial

Links booklink

Contact Us: admin [ a t ] ucptt.com