结构体指针需要初始化

过年过的大脑已经瓦特了。

#include <stdio.h>
#define N 10
#define MAXSIZE 100
typedef struct {
	int r[MAXSIZE+1];	/* 用于存储要排序数组 */ 
	int length;			/* 用于记录顺序表的长度 */
} SqList;

int main(void) {
	SqList sq; 
	sq.length = N;
	printf("%d", sq.length);
	return 0;
}

编译上面这段程序的时候发现居然出现内存泄露,一时间想不起来问题出在哪里,若干次调试之后,发现是因为没有对结构体内的数组进行初始化,造成了“野指针”。

在使用结构体指针变量的时候,往往容易犯一个“低级”错误,即定义一个结构体指针变量后就直接对结构体指针变量所指向的结构体成员进行操作,从而产生一些莫名其妙的错误。我们必须要给结构体指针变量赋予一个有效的结构体变量地址,才能正常操作结构体指针变量。比如:

这个程序输出的值将是不可预知的,因为“在程序中只是定义了一个结构体指针变量,并没有给该结构体指针变量赋一个有效值,因此该结构体变量所指向的地址将不确定,从而不能得到预期结果”

struct UART {
	int a;

	uchar b;
}

int main(void) {
	struct UART *p;
	p->a = 0xXXX;

	p->b = 0xXX;

	printf("%i,%c",p->b,p->a);
    return 0;
}

应该改为:

struct UART {
	int a;
	char b;
}

int main(void){
	struct UART? *p;
	struct UART dd;
	p = &dd; //这句一定要有,否则将出现不可预知的问题
	p->a = 0xXXX;
	p->b = 0xXX;
	printf("%i,%c",p->b,p->a);
	return 0;
}

对结构体内的指针初始化范例:

struct student{   
  char *name;   
  int score;   
  struct student* next;   
}stu,*stu1;    
  
int main(){    
  stu.name = (char*)malloc(sizeof(char)); /*1.结构体成员指针需要初始化*/  
  strcpy(stu.name,"Jimy");   
  stu.score = 99;   
  
  stu1 = (struct student*)malloc(sizeof(struct student));/*2.结构体指针需要初始化*/  
  stu1->name = (char*)malloc(sizeof(char));/*3.结构体指针的成员指针同样需要初始化*/  
  stu.next  = stu1;   
  strcpy(stu1->name,"Lucy");   
  stu1->score = 98;   
  stu1->next = NULL;   
  printf("name %s, score %d \n ",stu.name, stu.score);   
  printf("name %s, score %d \n ",stu1->name, stu1->score);   
  free(stu1);   
  return 0;   
}

 

转载于:https://my.oschina.net/niithub/blog/3013800

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值