指向未初始化的指针vs在为其分配内存后指向它

时间:2017-05-07 05:04:06

标签: c linked-list

这个疑问非常具体,请考虑以下代码 块中的两条线是我困惑的线。即。当我交换这两行时,我得到一个分段错误,但这个代码运行。所以我的问题是 当我换两条线时会发生什么?

#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; 
}


}

1 个答案:

答案 0 :(得分:1)

newp = (scale_node_t *)malloc(sizeof (scale_node_t));分配一个内存,用于保存scale_node_t的实例,并使newp保留该地址。在下一行,您将newp传递给结构,使其成为linkp的值。
因为在第一次运行循环时newp已定义,但其值为没有确定,它可以根据操作系统(也可能在编译器上)保存多个值:内存浪费,或者0(所以newp甚至可以在那里指向空指针),因此发生分段错误。
它是不允许在初始化之前使用任何变量(指针实际上是变量,将内存地址保存为数字),但是某些编辑器/环境/编译器可能不会在编译时向您发出警告。