1.voidTest(unsignedchar*str) 2.{ 3.assert(str!=NULL); 4./*函数处理代码*/ 5.} 毋庸置疑,标准 assert 宏同样会自动检测到这个 NULL 指针错误。与此同时,标准 assert 宏除给出以上信息之外,还能够显示出已经失败的测试条件。运行结果如图 2 所示。 图2 调用标准 assert 宏的运行结果 从上面的示例中不...
ASSERT(str!=NULL);/*函数处理代码*/}intmain(void) { Test(NULL);return0; } 很显然,因为调用语句“Test(NULL)”为参数 str 错误传入一个 NULL 指针的原因,所以 ASSERT 宏会自动检测到这个错误,同时根据宏 __FILE__ 和 __LINE__ 所提供的文件名和行号参数在标准错误输出设备 stderr 上打印一条错误消...
ASSERT(str!=NULL);/*函数处理代码*/}intmain(void) { Test(NULL);return0; } 很显然,因为调用语句“Test(NULL)”为参数 str 错误传入一个 NULL 指针的原因,所以ASSERT宏会自动检测到这个错误,同时根据宏__FILE__和__LINE__所提供的文件名和行号参数在标准错误输出设备 stderr 上打印一条错误消息,然后调...
Test(NULL); return0; } 很显然,因为调用语句“Test(NULL)”为参数 str 错误传入一个 NULL 指针的原因,所以 ASSERT 宏会自动检测到这个错误,同时根据宏 __FILE__ 和 __LINE__ 所提供的文件名和行号参数在标准错误输出设备 stderr 上打印一条错误消息,然后调用 abort 函数中止程序的执行。运行结果如图 1 所...
但遗憾的是,在调用该函数时,如果不小心为 dest 与 src 参数错误地传入了 NULL 指针,那么问题就严重了。轻者在交付之前这个潜在的错误导致程序瘫痪,从而暴露出来。否则,如果将该程序打包发布出去,那么所造成的后果是无法估计的。 由此可见,不能够简单地认为“只要通过编译程序成功编译的就都是安全的程序”。当然,编...
现在,通过“if(dest==NULL)与if(data-src==NULL)”判断语句,只要在调用该函数的时候为 dest 与 src 参数错误地传入了NULL指针,这个函数就会检查出来并做出相应的处理,即先向标准错误流 stderr 打印一条出错信息,然后再调用 abort 函数终止程序运行。
void ReverseStr(char * str) { assert(NULL != str); // 其余代码 } 而当我问其为什么使用assert,而不是一个if语句的时候,没有人能给出正确的解释。不过结果也不出意思,能在此处使用assert的人,就说明他不理解assert是什么。这也是我为什么会增加这一个小节内容的原因。
上面的 Memcpy 函数是可以通过编译程序的,但假设 dest 与 src 实参错误地传入了 NULL 指针就会出现错误。面对这类编译器检查不出来的问题,最简单的方式是使用 if 语句进行判断检查: void *Memcpy(void *dest, const void *src, size_t len) { if(dest == NULL) ...
String str = "Hello"; assertNull(str); // 测试失败,输出错误信息 ``` 6. assertNotNull:与assertNull相反,用于判断一个对象是否不为空。如果对象不为空,则测试通过;如果为空,则测试失败,并输出错误信息。例如: ```java String str = null; assertNotNull(str); // 测试失败,输出错误信息 ...
assert(str!=NULL);//断言,如果传入字符串首地址为空, 报错并停止运行,同时指出错误位置 unsigned int count; while(*str!='\0') { str++; count++; } return count; } int main(void) { char a[]="hello world"; char *p = a; printf("size=%d\n",Get_Size_Count(p)); ...