过年过的大脑已经瓦特了。
#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 = ⅆ //这句一定要有,否则将出现不可预知的问题
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;
}