#include "stdio.h"
#include "string.h"
#define MAXSIZE 20
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int status;
typedef int elem_type;
typedef struct
{
elem_type data[MAXSIZE]; /* 数组,存储数据元素 */
int length; /* 线性表当前长度 */
}sq_list;
/* 初始化线性表 */
status init_list(sq_list *list)
{
memset(list, 0, sizeof(sq_list));
return OK;
}
/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
status list_is_empty(const sq_list *list)
{
printf("list_is_empty:\n");
printf("list = %p\n", list);
printf("list->length = %d\n",list->length);
printf("&(list->length) = %p\n\n",&(list->length));
if (list->length == 0) {
return TRUE;
} else {
return FALSE;
}
}
/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
status list_is_empty1(const sq_list list)
{
printf("list_is_empty1:\n");
printf("&list = %p\n",&list);
printf("list.length = %d\n",list.length);
printf("&(list.length) = %p\n\n",&(list.length));
if (list.length == 0) {
return TRUE;
} else {
return FALSE;
}
}
void test_fun(void)
{
sq_list a;
printf("test_fun:\n");
printf("&list = %p\n", &a);
printf("list.length = %d\n", a.length);
printf("&(list.length) = %p\n\n", &(a.length));
init_list(&a);
(void)list_is_empty(&a);
(void)list_is_empty1(a);
return;
}
void main(void)
{
test_fun();
}
这段代码在我机子上运行结果如下:
test_fun:
&list = 0x7ffc4ca8a4b0
list.length = 2035679176
&(list.length) = 0x7ffc4ca8a500
list_is_empty:
list = 0x7ffc4ca8a4b0
list->length = 0
&(list->length) = 0x7ffc4ca8a500
list_is_empty1:
&list = 0x7ffc4ca8a450
list.length = 0
&(list.length) = 0x7ffc4ca8a4a0
在test_fun输出中length的值为垃圾值,是因为结构体还没初始化。
在test_fun和list_is_empty中所只指向的空间为同一空间。而list_is_empty1中开辟了新空间,相对浪费。
今天这个随笔想表达的是,结构体传递尽量使用传递指针地址,否则又会开辟新的空间,造成不必要的浪费。