下面一段代码,想在调用 f2(1) 时打印 err1,调用 f2(2) 时打印 err4,但是代码中有一些问题,请做尽可能少的修改使之正确。 static int f1( const char *errstr, unsigned int flag ) { int copy, index, len; const static char **__err = { "err1", "err2", "err3", "err4" }; if( flag & 0x10000 ) copy = 1; index = ( flag & 0x300000 ) >> 20; if( copy ) { len = flag & 0xF; errstr = malloc( len ); if( errstr = NULL ) return -1; strncpy( errstr, __err[index], sizeof( errstr ) ); } else errstr = __err + index; } void f2( int c ) { char *err; swtch( c ) { case 1: if( f1( err, 0x110004 ) != -1 ) printf( err ); case 2: if( f2( err, 0x30000D ) != -1 ) printf( err ); } }
程序中存在大量错误,可改为
static int f1(char **errstr, unsigned int flag)
{
int copy = 0, index, len;
const static char *__err[4] = {"err1", "err2", "err3", "err4"};
if(flag & 0x10000)
copy = 1;
index = (flag & 0x300000) >> 20;
if(copy)
{
len = flag & 0xF;
*errstr = (char*)malloc(len * sizeof(char));
if(*errstr == NULL)
return -1;
strncpy(*errstr, __err[index - 1], sizeof(errstr));
}
else
*errstr = (char*)(*(__err + index));
}
void f2(int c)
{
char **err = (char**)malloc(sizeof(char*));
switch(c) //dongguo
{
case 1:
if(f1(err, 0x110004) != -1)
printf(*err);
printf("\n");
break;
case 2:
if(f1(err, 0x30000D) != -1)
printf(*err);
printf("\n");
break;
}
free(err);
}