栈
stdlib.h: stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。 time.h time.h是C/C++中的日期和时间头文件。得到从程序启动到此次函数调用时累计的毫秒数。 NVIDIA面试笔试题之一: assert.h是c标准库的一个头文件,该头文件的主要目的就是提供一个assert的宏定义。 assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用abort(),产生异常中断,exit出来。 该宏可以屏蔽掉,只需在包含assert.h之前#define NDEBUG,想开再#undef。从这里可以看出预处理带来的方便。 函数名: assert 功 能: 测试一个条件并可能使程序终止 用 法: void assert(int test); 程序例: #include <assert.h> #include <stdio.h> #include <stdlib.h> struct ITEM { int key; int value; }; void additem(struct ITEM *itemptr) { assert(itemptr != NULL); } int main(void) { additem(NULL); return 0; } assert() 函数用
1 法 2 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: 3 #include <assert.h> 4 void assert( int expression ); 5 assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息, 6 然后通过调用 abort 来终止程序运行。 7 请看下面的程序清单badptr.c: 8 #include <stdio.h> 9 #include <assert.h> 10 11 12 #include <stdlib.h> 13 14 15 int main( void ) 16 17 18 { 19 FILE *fp; 20 fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件 21 assert( fp ); //所以这里不会出错 22 23 fclose( fp ); 24 25 fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失 26 assert( fp ); //所以这里出错 27 fclose( fp ); //程序永远都执行不到这里来 28 return 0; 29 } 30 [root@localhost error_process]# gcc badptr.c 31 [root@localhost error_process]# ./a.out 32 a.out: badptr.c:14: main: Assertion `fp' failed. 33 已放弃 34 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 35 在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下: 36 #include <stdio.h> 37 #define NDEBUG 38 #include <assert.h> 39 用法总结与注意事项: 40 1)在函数开始处检验传入参数的合法性 41 如 42 int resetBufferSize(int nNewSize) 43 { 44 //功能:改变缓冲区大小, 45 46 47 //参数:nNewSize 缓冲区新长度 48 //返回值:缓冲区当前长度 49 //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 50 assert(nNewSize >= 0); 51 assert(nNewSize <= MAX_BUFFER_SIZE); 52 } 53 2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失 54 不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 55 好: assert(nOffset >= 0); 56 assert(nOffset+nSize <= m_nInfomationSize); 57 3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题 58 错误: assert(i++ < 100) 59 这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。 60 61 62 正确: assert(i < 100) 63 i++; 64 4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感 65 5)有的地方,assert不能代替条件过滤 66 注意:当对于浮点数: 67 #include<assert.h> 68 // float pi=3.14; 69 // assert(pi=3.14); // 70 71 float pi=3.14f; 72 assert (pi=3.14f); 73 --------------------------------------------------------- 74 在switch语句中总是要有default子句来显示信息(Assert)。 75 int number = SomeMethod(); 76 switch(number) 77 { 78 case 1: 79 Trace.WriteLine("Case 1:"); 80 break; 81 case 2: 82 Trace.WriteLine("Case 2:"); 83 break; 84 default : 85 Debug.Assert(false); 86 break; 87 } 88 89 函数名: assert 功 能: 测试一个条件并可能使程
序终止 用 法: void assert(int test); 例 如: assert(item != NULL); //如果条件不成立,则程序终止