话说内存的动态使用真是C/C++的一门学问哪,没有了指针和动态内存的使用不知道C/C++
会失色多少。当然了,这也是叫人头疼的东西。当然了有一个很重要的东西可以在一定程度上防止问题的出现:那就是比IF语句判定更加有效的东西ASSERT宏:
编成中的感悟,拿合并两个有序数组来说明吧:
#include "iostream.h"
#include "stdio.h"
#include "assert.h"
#include "stdlib.h"
int * Merge( int s1[], int s2[], int s1Len, int s2Len)
{
assert(s1!=NULL && s2!=NULL);
int *p1, *p2, *p3, *s3;
p1 = s1;
p2 = s2;
s3 = (int*) malloc (sizeof(int)*(s1Len + s2Len));
p3 =s3;
if (s3==NULL)
{
printf("ERROR on S3 = NULL!");
//虽然有这么一句,但是有时显示不出来!这时间Assert就重要了!
return NULL ;
}
assert(s3!=NULL);
while (s1Len>0 && s2Len>0)
{
if (*p1 <= *p2)
{
*p3 =*p1;
p1++;
p3++;
s1Len--;
}
else if (*p1 > *p2)
{
*p3 = *p2;
p2++;
p3++;
s2Len--;
}
}
while (s1Len > 0)
{
*p3 = *p1;
p3++;
p1++;
s1Len--;
}
while (s2Len > 0)
{
*p3 = *p2;
p3++;
p2++;
s2Len--;
}
return s3;
}
第一出是防止函数的入口错误,跟林锐学来的^_^!。
然后么就是重点了:
if (s3==NULL)
{
printf("ERROR on S3 = NULL!");
//虽然有这么一句,但是有时显示不出来!这时间Assert就重要了!
return NULL ;
}
其实就是s3是NULL也不是一定就显示出来,奇怪把,不欣可以在这句前面加个
S3 = NULL .这时 assert(s3!=NULL);起到了最后保证的一个功能。提示错误。
否则就是提示什么XXX内存是不可读的(就VC6.0来说)。
这里还有就是明明是if (s3==NULL) 如果不小心写成if (s3=NULL)了
这时assert几乎成了最后改正的机会,否则那个地方错都不知道!
好了感想写到这里了,最近压力大啊。