goto
项目经验:程序的质量与goto出现的次数成反比
潜规则:禁用goto
#include <stdio.h>
#include <malloc.h>
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;
}
执行结果:
void的意义(修饰函数的返回值和参数)
-如果函数没有返回值,那么应该声明为void
-如果函数没有参数,应该声明为void
#include <stdio.h>
f()
{
}
int main()
{
int i = f(1,2,3);
return 0;
}
运行结果:
C语言中函数不写参数表示可以接受任意多的参数,不写返回值,系统默认返回int。
#include <stdio.h>
void f(void)
{
}
int main()
{
f();
return 0;
}
不存在void变量
-C语言没有定义void是多大内存的别名
-没有void的标尺
-无法再内存中裁剪出void对应变量
#include <stdio.h>
int main()
{
printf("void = %ld\n",sizeof(void));
return 0;
}
运行结果:
在gcc编译器里面对标准C做了扩展,void的大小为1。而BCC编译器支持标准C规范,编译报错。
void指针的意义
-C语言规定只有想同类型的指针才可以相互赋值
-void*指针作为左值用于接受任意类型的指针
-void*指针作为右值使用时需要进行强制类型转换
#include <stdio.h>
void MenSet(void* src,int length,unsigned char n)
{
unsigned char* p = (unsigned char*)src;
int i = 0;
for(i=0;i<length;i++)
{
p[i] = n;
}
}
int main()
{
int a[5];
int i = 0;
MenSet(a,sizeof(a),0);
for(i=0;i<5;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
执行结果: