这个疑问非常具体,请考虑以下代码 块中的两条线是我困惑的线。即。当我交换这两行时,我得到一个分段错误,但这个代码运行。所以我的问题是 当我换两条线时会发生什么?
#include<stdio.h>
#include<stdlib.h>
typedef struct scale_node_s {
char note[4];
struct scale_node_s *linkp;
} scale_node_t;
int main(){
scale_node_t *scalep, *prevp, *newp,*walker;
int i;
scalep = (scale_node_t *)malloc(sizeof (scale_node_t));
scanf("%s", scalep->note);
prevp = scalep;
for(i = 0; i < 7; ++i) {
//---------------------------------------
newp = (scale_node_t *)malloc(sizeof (scale_node_t));
prevp->linkp = newp;
//---------------------------------------
scanf("%s", newp->note);
prevp = newp;
}
walker = scalep;
for(i = 0 ; i < 7 ; i++){
printf("%s",walker->note);
walker = walker->linkp;
}
}
答案 0 :(得分:1)
行newp = (scale_node_t *)malloc(sizeof (scale_node_t));
分配一个内存,用于保存scale_node_t
的实例,并使newp
保留该地址。在下一行,您将newp
传递给结构,使其成为linkp
的值。
因为在第一次运行循环时newp
已定义,但其值为没有确定,它可以根据操作系统(也可能在编译器上)保存多个值:内存浪费,或者0(所以newp
甚至可以在那里指向空指针),因此发生分段错误。
它是不允许在初始化之前使用任何变量(指针实际上是变量,将内存地址保存为数字),但是某些编辑器/环境/编译器可能不会在编译时向您发出警告。