#include <stdio.h>
#include <stdlib.h>
struct Child {
};
struct Parent {
struct Child *child;
};
int main(void)
{
struct Child *child = (struct Child *)malloc(sizeof(struct Child));
struct Parent *parent;
parent->child = child;
return 0;
}
报错为:bash: line 1: 30009 Segmentation fault: 11 "~/Code/hello_c/main",但是如果把这两行交换,就不会报错,如下:
struct Parent *parent;
struct Child *child = (struct Child *)malloc(sizeof(struct Child));
想不通是为啥,特来请教。
1
justou 2021 年 4 月 29 日
你的 parent 指针没分配内存
|
2
newmlp 2021 年 4 月 29 日 这。。。也太新手了
|
3
Jf35jxN3fwBXyeLh 2021 年 4 月 30 日
哈哈哈,果然是新手
|
4
araraloren 2021 年 4 月 30 日
这。。建议学习 rust 去吧
|
5
Uu6p94cFbGXx7duC OP 各位,我才学了一天,大可不必冷嘲热讽。原以为 v 站风气会好一点,看来也不过如此。顺便请教一下,如何注销账号。
|
6
rbut 2021 年 4 月 30 日
脾气好像有点大。
|
7
lance6716 2021 年 4 月 30 日 via Android 自己能说自己是新手,别人说不行🤔
|
8
JamesMackerel 2021 年 5 月 1 日 via iPhone
我有点好奇,为啥交换就不会错了……
|
9
killeder 2021 年 5 月 1 日
newbie
|
10
sunnywqf 2021 年 5 月 2 日 via iPhone
@JamesMackerel 同好奇,一会儿用 Windows 试试
|
11
sunnywqf 2021 年 5 月 2 日
@JamesMackerel #8 估计楼主说错了吧, 用 https://gcc.godbolt.org/ 看了下生成的 arm 汇编, 交换这两行,没有任何的变化 .
|
12
sunnywqf 2021 年 5 月 2 日
多执行几遍呢, 是不是会有出错的时候.
|
13
zjsxwc 2021 年 5 月 2 日
换不换顺序都会报错
[zjsxwc@manjaro]$ git diff q.c q2.c diff --git a/q.c b/q2.c index 032ef4a..517a6db 100644 --- a/q.c +++ b/q2.c @@ -10,8 +10,8 @@ struct Parent { int main(void) { - struct Child *child = (struct Child *)malloc(sizeof(struct Child)); struct Parent *parent; + struct Child *child = (struct Child *)malloc(sizeof(struct Child)); parent->child = child; [zjsxwc@manjaro]$ gcc -o q.out q.c [zjsxwc@manjaro]$ gcc -o q2.out q2.c [zjsxwc@manjaro]$ ./q.out Segmentation fault (core dumped) [zjsxwc@manjaro]$ ./q2.out Segmentation fault (core dumped) |
14
yolee599 2021 年 5 月 3 日
这个行为很危险啊,函数内定义的变量 parent 没初始化的时候是不确定的,也就是说你给一个不确定的地址赋值,百分百造成内存溢出。
|
15
csfreshman 2021 年 5 月 3 日
正确的写法是:
int main(void) { struct Child *child = (struct Child *)malloc(sizeof(struct Child)); struct Parent parent; parent.child = child; printf("hello,world"); return 0; } 交换顺序也不会正确运行,最简单的写法是声明栈变量 parent,当然也可以分配堆变量(malloc),你的写法没有分配内存,直接对一个未初始化的指针操作是未定义行为。 |
16
BrettD 2021 年 5 月 4 日
新手脾气还这么大,牛气上天了
|
17
ch2 2021 年 5 月 4 日
交换后没报错只是你运气好,这种写法是完全错误的
|
18
crazytec 2021 年 5 月 4 日 via Android
兄弟,我觉得这种问题直接上 stackoverflow 或者在各种群里问就行了(反正 rust 有中国 tg 非官方群,c 不知道有没有)。我个人的见解是 V2EX 和知乎的定位比较类似,都是偏向生活(比如讨论一下新闻或者是自己的人生经验)而非严肃的编程话题(比如说代码哪里错了之类的)。v2ex 的主页、热门机制都是为了更多人看到一个帖子并且讨论,因此很多情况下点进帖子的人根本没想解答你的疑惑(甚至连 c 语言怎么写都不知道),单纯就是想发表一下自己的意见。在这种偏技术的帖子里,他们就只好喷一下“新手”这个词。不用太放在心上就行了🙂
|
19
Kasumi20 2021 年 5 月 4 日
struct Parent *parent;
这个应该是为定义行为吧?有的编译器会设为 0,所以段错误 有的是个不处理的野指针,所以可能不报错。 |
21
gBurnX 2021 年 5 月 4 日
@Uu6p94cFbGXx7duC
1.冷嘲热讽的人在哪都有。前两天国内微软 2 把手下面的一个小屁孩,带着两个小伙伴,在某和一个 IT 细分方向新晋领域的老板吵了几天架。他们那种层次,同样有冷嘲热讽的。 2.你问问题,有高手回复,你达到目的就好。没必要注销账号。这个论坛里还是有很多大神潜伏着,时不时他们就会发点重要心得,你注销账号,不来这个论坛了,其实是你自己的损失。 3.另外,你可以看看那些嘲讽你的小伙伴,点开他们的资料,看看他们的提问与回复。看完后,你再想想,为这种层次的人生气,值得嘛? |