【指针】指针有效性检测必要性|空指针/无确切类型指针 viod *

70 篇文章 18 订阅

目录

指针有效性的有效性检测的必要性!!

题目:

解说:

空指针/无确切类型指针 viod *


指针有效性的有效性检测的必要性!!

2012-04-01 22:44:42

题目:

已知strcpy函数的原型是:

char * strcpy(char * strDest,const char * strSrc);

1.不调用库函数,实现strcpy函数。

2.解释为什么要返回char *。

解说:

1.strcpy的实现代码

char * strcpy(char * strDest,const char * strSrc)

{

char * strDestCopy=strDest; //[3]

if ((strDest==NULL)||(strSrc==NULL)) //[1]

throw "Invalid argument(s)"; //[2]

while ((*strDest++=*strSrc++)!='\0'); //[4]

return strDest;

}

错误的做法:

[1]

(A)不检查指针的有效性,说明答题者不注重代码的健壮性。

  (B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。

(C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。

例子来源:strcpy_百度百科

指针有效性的有效性检测的必要性!!

•指针的危险
 
   long *fellow;

  *fellow=22322;

  fellow确实是一个指针,但它指向哪里呢?上述代码没有将地址赋给fellow,那么22322将被放哪,我们并不知道。由于fellow没有被初始化,它可能 有任何值。不管值是什么,程序都将它解释为存储
22322的地址。如果fellow的值碰巧为0060,计算机将把数据放在地址0060上,即使这个地址恰巧是程序代码所在的地址,这种错误可能会导致一些最隐匿、最难以跟踪的bug。
解决办法:一定要在对指针应用*运算符之前,将指针初始化为一个确定的、适当的地址。这是使用指针的金科玉律。


所以指针有效性的检测的意义在于,不会将指针初始化在一个 程序代码所在的地方,避免了指针给程序所在的地方赋值造成程序的buge。

空指针/无确切类型指针 viod *

2012-10-17 16:36:05

 首先:
void* 这不叫空指针,这叫无确切类型指针.这个指针指向一块内存,却没有告诉程序该用何种方式来解释这片内存.所以这种类型的指针不能直接进行取内容的操作.必须先转成别的类型的指针才可以把内容解释出来.

还有'\0',这也不是空指针所指的内容. '\0'是表示一个字符串的结尾而已,并不是NULL的意思.

真正的空指针是说,这个指针没有指向一块有意义的内存,比如说:
char* k;
这里这个k就叫空指针.我们并未让它指向任意地点.
又或者
char* k = NULL;
这里这个k也叫空指针,因为它指向NULL 也就是0,注意是整数0,不是'\0'
一个空指针我们也无法对它进行取内容操作.
空指针只有在真正指向了一块有意义的内存后,我们才能对它取内容.也就是说要这样
k = "hello world!";
这时k就不是空指针了.

其本质在于void *(无类型指针)可以包容任何类型的指针,也就是可以把任何类型指针赋值给void ×,但反过来将void ×赋值给某一类型指针时则必须强制类型转换。
举例说明:
我们知道C语言中函数返回值得类型必须确定,也就是一个函数只能返回其固定类型的值,那么如果需要根据不同输入值返回不同类型的结果怎么办?这样就可以:
定义一个结构体,两个字段,data为数据,type为类型
typedef struct _Data
{
    void *data;           // 数据字段,指向具体创建的控件的数据
    TYPE type;          // 类型(只读属性,开发人员请勿直接修改)
}Data;
那么函数就可以这样写:
Data getData(TYPE type){
        Data data;
        if(type == "数字"){    


                data.type = "数字";
                data.data = maollc一段内存,里面放具体数字
        }else if(type == "字符串"){
                data.type = "字符串"
                data.data = maollc一段内存,里面放具体字符串
        }
        return data;
}
这样用时就很方便了,
Data myData = getData("数字");
printf("%d", *((int *)myData.data));


Data myData = getData("字符串");
printf("%s", (char *)myData.data);


不仅统一了接口(都调用getData()函数),返回值也可以随便作为参数传递,只有要用到具体数据的时候再将它取出来。
不仅可以实现多态,还可以实现继承...

函数的类型是空指针,有什么作用?void *initiate(...)这样的函数_百度知道

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值