来自 科技 2020-07-14 17:32 的文章

几个无聊但你可能忽略的C知识点


几个无聊但你可能忽略的C知识点


C语言main函数的写法

标准中,只有下面两种写法:

intmain(void){/**body**/}

以及

intmain(intargc,char*argv[]){/**body**/}

而C++的第二种与C类似,第一种是这样的:

intmain(){/**body**/}
参考《C语言的main函数到底该怎么写》

如果没有返回类型

#include<stdio.h>
test()
{
printf("https://www.yanbinghu.com\n");
}
intmain(void){
test();
return0;
}

它会默认为int

$gcc-otesttest.c
test.c:2:1:warning:returntypedefaultsto‘int’[-Wimplicit-int]
test()
^

注意,使用函数前一定要声明,对于没有声明,而试图使用,可能会错将int用成其他类型,导致灾难。参考《记64位地址截断引发的挂死问题》

如果main函数没有return
#include<stdio.h>
intmain(void){
printf("lalalala\n");
}

编译器一般都会帮你在最后加上return 0。

结构体成员赋值

结构体里还有结构体,你还一个一个成员的复制?


//https://www.yanbinghu.com
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
structInfo_t0
{
inta;
intb;
charstr[128];
};
structInfo_t
{
structInfo_t0c;
intd;
};
intmain(void){
structInfo_t*test=malloc(sizeof(structInfo_t));
memset(test,0,sizeof(structInfo_t));
test->c.a=10;
test->c.b=24;
strncpy(test->c.str,"https://www.yanbinghu.com",sizeof("https://www.yanbinghu.com"));
test->d=10;
structInfo_ttest1;
test1.c=test->c;//成员直接赋值,完成拷贝
free(test);
test=NULL;
printf("test1.c.a=%d,test1.c.b=%dtest1.c.str=%s\n",test1.c.a,test1.c.b,test1.c.str);
return0;
}

输出结果:

test1.c.a=10,test1.c.b=24test1.c.str=https://www.yanbinghu.com
打印字符串不检查空

打印字符串时,没有结束位置是致命的!


//https://www.yanbinghu.com
#include<stdio.h>
intmain(void){
char*p=NULL;
printf("%s\n",p);//灾难!
chararr[]={'h','e','l','l','o'};
printf("%s\n",arr);//灾难!
return0;
}

参考《NULL,0,'\0'的区别》和《你可能不知道的printf》。

输出百分号

//https://www.yanbinghu.com
#include<stdio.h>
intmain(void){
printf("%%\n");//输出%号
return0;
}
代码太长换行
#include<stdio.h>
#defineTEST"https://www.yan\
binghu.com"
intmain(){
printf("HelloWorld%s\n",TEST);

return0;
}
判断两数之和是否超出范围

相关文章《C语言入坑指南-整型的隐式转换与溢出》。


#include<stdio.h>
#include<limits.h>
intmain(){
inta=INT_MAX-10;
intb=INT_MAX-20;
//if(a+b>INT_MAX),不能这样做
if(a>INT_MAX-b)
printf("a+b>INT_MAX");
return0;
}

求平均值:

//交流群:1073932648
#include<stdio.h>
#include<limits.h>
intaverage(inta,intb){
return(b-(b-a)/2);
}
intmain(){
inta=100;
intb=INT_MAX-10;
printf("averageab:%d\n",average(a,b));
return0;
}
关注我:带你遨游代码的世界~获取更多:私信 “资料” 获取