c实践感悟(杂谈)

#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中开辟了新空间,相对浪费。

今天这个随笔想表达的是,结构体传递尽量使用传递指针地址,否则又会开辟新的空间,造成不必要的浪费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值