作者ptt0720 (湿湿)
看板C_and_CPP
标题[问题] segmentation fault产生原因
时间Mon Jun 26 16:29:35 2017
开发平台(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");
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.114.123.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1498465781.A.A1C.html
1F:→ ptt0720: 补充一下 这是在做完整二元树的走访 用DFS06/26 16:31
2F:→ Hazukashiine: 我刚刚在linux上测:124536706/26 16:35
3F:→ Hazukashiine: 你的 _node[4-7] 的 _child(2) 没有 initialize06/26 16:37
4F:→ Hazukashiine: 把 malloc 改成 calloc 试试06/26 16:37
※ 编辑: ptt0720 (140.114.123.150), 06/26/2017 16:56:38
5F:→ ptt0720: 1245367无误 我改正了 请问初始化哪边呢 06/26 16:57
6F:→ ptt0720: 初始化成null吗 06/26 16:57
7F:→ ptt0720: 成功了 非常感谢 请问windows系统没报错console也错有人 06/26 17:02
8F:→ ptt0720: 知道原因吗 06/26 17:02
9F:→ Hazukashiine: 初始化为 null 这个 scenario compiler 不太容易 06/26 17:29
10F:→ Hazukashiine: 侦测出 "use uninitialize values" 所以要用其他的 06/26 17:29
11F:→ Hazukashiine: 工具像是一些动态分析器 06/26 17:30
12F:→ Hazukashiine: null -> NULL uninitialize -> ~d 06/26 17:31
13F:→ Hazukashiine: 虽然我不确定用 calloc 取代 assign to NULL 有没有 06/26 17:32
14F:→ Hazukashiine: 符合语言标准 但是我的经验这样做基本上没问题 06/26 17:33
16F:推 MIKEmike07: Use Valgrind 测测看 06/26 17:49
17F:→ hunandy14: 请问~是直接设0就好吗 calloc(sizeof(Node), 0); 06/27 01:16
18F:推 Bencrie: 读手册 06/27 09:26
19F:→ hunandy14: 看一下,误会用法了...已为像是 new T(value); 06/28 20:14
20F:→ TobyH4cker: 写一个createNode做申请跟初值化解决 07/03 04:39
21F:推 kevin85421: struct中的pointer若是没有初始化则address pointer 07/11 10:57
22F:→ kevin85421: 中存的address会跑掉,所以我一直很佩服可以不用class 07/11 10:57
23F:→ kevin85421: 来maintain一个大型的project的人 07/11 10:57
24F:→ dou0228: struct 写的好,是可以非常类似 class 的 07/12 09:41
25F:→ dou0228: 楼上讲的,看一下 Linux Kernel,只用 C 写 07/12 09:42
26F:→ dou0228: 那不叫做 pointer address 跑掉,要记得自行 initial 07/12 09:46