我们在 C 语言中经常会见到 void ,也会偶尔见到 goto。那么 C 语言中既然有 goto ,为什么我们在代码中见的很少呢?在以前很多的项目经验中,我们得到这样一条潜规则:一般项目都是禁用 goto 的,程序质量与 goto 的出现次数成反比。自后也就造成了我们一般不会使用 goto 。
为阳信等地区用户提供了全套网页设计制作服务,及阳信网站建设行业解决方案。主营业务为成都网站设计、网站制作、阳信网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!我们来分析下面这个示例代码,看看 goto 会带来什么影响。
#include#include void func(int n) { int* p = NULL; if( n < 0 ) { goto STATUS; } p = (int*)malloc(sizeof(int) * n); STATUS: p[0] = n; free(p); } int main() { printf("begin...\n"); printf("func(1)\n"); func(1); printf("func(-1)\n"); func(-1); printf("end...\n"); return 0; }
那么在 function(1) 中,函数会正常执行退出。在 function(-1) 中,函数则会发生段错误,为什么呢?因为 goto 改变了函数的执行流。指针 p 没有申请就要使用并释放。我们来看看编译的结果是否如我们所想?经过编译, 我们发现虽然函数能编译过,但是执行的时候发生了段错误。
下来我们来讲讲 void 。当函数没有返回值时,应将其声明为 void;如果函数没有参数,应将其参数声明为 void ;void 修饰函数返回值和参数是为了表示“无”。那么在 C 语言中,到底有没有定义 void 的内存大小呢?在标准的 C 中是没有定义它的大小的,但是在一些 C 的扩展编译器中定义了。比如在 gcc 编译器中就定义 void 的大小为 1。我们可以在 gcc 编译器中试下,结果如下所示:
那么对于 void 指针有什么意义呢?C 语言规定只有相同类型的指针才能相互赋值,void* 指针作为左值用于“接收”任意类型的指针,void* 指针作为右值使用时需要进行强制类型转换。
我们来通过 void* 实现 MemSet 函数,具体代码如下:
#includevoid MemSet(void* src, int length, unsigned char n) { unsigned char* p = (unsigned char*)src; int i = 0; for(i=0; i 我们可以看到因为 MemSet 函数的第一个参数为 void* ,所以数组 a 的类型不管是 int、char、float还是 double,都不会报错。但是如果我们规定的是 int* 的话,下面数组 a 的类型为 double 的话,就会报错。我们改成这样试试,看编译器是否会报错。效果如下:
那么我们本次学习了 goto 和 void,通过本次学习,总结如下:1、在现在的项目工程中一般是禁用 goto 语句的;2、void 是一种抽象的数据类型;3、void 类型不能用于定义变量、但可以用来声明函数无参数、无返回值;4、可以定义 void* 类型的指针;5、void* 类型的指针可以接受任意类型的指针值。后面我们会继续对 C 语言的学习。
欢迎大家一起来学习 C 语言,可以加我QQ:243343083。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:C之goto和void(八)-创新互联
文章地址:http://kswsj.cn/article/pjsss.html