参考:《Linux C编程从基础到实践》
##################################
main函数解析
Linux下main函数的标准调用格式如下:
int main(int argc, char *argv[])参数argc必须是整型变量,其是命令行参数的数目;argv必须是指向字符串的指针数组,这些指针分别指向各个命令行参数
Linux命令行的一般形式为:
可执行文件名 参数 参数 ...
但是,main的两个形参和命令行中的参数在位置上不是一一对应的。因为,main的形参只有两个,而命令行中的参数个数原则上未加限制。
argc参数表示了命令行中参数的个数(注意,可执行文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。
note:如果不需要传递参数,可以省略main函数的参数,直接写为int main(void)
此外,main函数也带有返回值,默认的返回值类型为int,在一般的程序中,main函数的返回值类型int可以省略不写,返回值会直接传递给Linux内核,如果main函数的最后没有写return语句的话,gcc会自动在生成的目标文件中加入"return 0;",表示程序正常退出,main函数的返回值可以将执行的相应结果反馈给内核
应用实例 - main.c:
#include
int main(int argc, char *argv[])
{ //第一个存放参数的个数,第二个缓冲区存放参数
int i=0;
printf("%d\n", argc);
for (i=0; i
{
printf("%s\n", argv[i]);
}
}
gcc编译:
gcc -o main main.c
给main函数的参数字符串是"this is a test!",这个参数字符串包括了4个字符串,然后算上可执行文件本身的字符串,所以argc的数目是5。
#################################################3
时间函数
头文件为:
#include
int gettimeofday(struct timeval *tv, struct timezone *tz);gettimeofday获取当前时间和时区信息,需要超级用户的权限,tv参数用于指向存放返回时间信息的缓冲区:
struct timeval {
time_t tv_sec; //秒
suseconds_t tv_usec;//微妙
};
tz用于存放相应的时钟信息:
struct timezone {
int tz_minuteswest; //minutes west of Greenwich
int tz_dsttime; //type of DST correction
}
应用实例 - 计算代码运行时间:
首先调用gettimeofday函数获得当前的时间信息,然后将这些时间信息分门别类地输出,最后测试本身的执行时间:
//获取秒和微妙时间,现实和Greenwich的时间差,并且测试运行这段程序所需要的时间
#include
#include
#include
int main(void)
{
struct timeval start, end;
struct timezone timez;
gettimeofday(&start, &timez); //获取当前时间
printf("tv_sec: %d\n", start.tv_sec); //输出秒
printf("tv_usec: %d\n", start.tv_usec); //输出毫秒
printf("tz_minuteswest: %d\n", timez.tz_minuteswest);
printf("tv_dsttime: %d\n", timez.tz_dsttime);
gettimeofday(&end, &timez);
printf("end_usec-start_usec: %d\n", (end.tv_usec-start.tv_usec));
//计算程序执行的时间
return 0;
}
gcc编译命令:
gcc -o time time.c
##########################################################33
C语言代码的分配机制
Linux操作系统提供了三个用于存储空间动态分配的函数和一个用于释放内存空间的函数:
malloc:给进程分配指定字节数的存储区,此存储中的初始值不为0
calloc:为指定流数量具有指定长度的对象分配存储空间,该空间中每一位都被初始化为0
realloc:更改以前分配区的长度(可以增加,也可以减少),当为增加长度时,可能需要将以前分配区间的内容迁移到另外一个足够大的区域,在尾部提供增加的存储区,而新增加的区间内的初始化值不确定。
free:用于释放其参数指针指向的存储空间,这些空间会被送入系统的可用存储区池,可以被以上三个函数再次分配。
头文件:
#include
其中三个分配函数如果调用成功,则返回一个指向分配区的非空指针,否则返回空指针,而free函数没有返回值:
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
void free(void *ptr);
在这三个内存分配函数中,realloc函数使得用户可以增加或者减少以前分配的内存空间的长度,例如可以使其减少使用固定长度的数组,从而节省内存空间,但是其最后一个参数newsize是新分配的存储区长度,而不是分配后存储区的总长度,如果ptr指向一个空指针的话,则realloc函数的功能和malloc是完全相同的。