0
Buffer* b_create(int init_capacity, char inc_factor,char o_mode){

Buffer* buffer=NULL;    /*local pointer to the buffer structure on heap*/ 

if (o_mode=='f' || inc_factor==0){
    o_mode=0;
    inc_factor=0;
}else if (o_mode=='f' && inc_factor!=0){
    o_mode=0;
    inc_factor=0;
}else if (o_mode=='a' && 1<=inc_factor<=255){
    o_mode=1;
    inc_factor=inc_factor;
}else if (o_mode=='m' && 1<=inc_factor<=100){
    o_mode=-1;
    inc_factor=inc_factor;
}
else{
    buffer=NULL;
    return buffer;
}

    //throw a more meaningful error??

    //cleanup :: how about i just call the ca_destroy() ??
    /*
    free(buffer->ca_head);
    buffer->ca_head=NULL;
    free(buffer);
    buffer=NULL;
*/

buffer = (Buffer*)malloc(sizeof(Buffer));
buffer->ca_head=(char*)malloc(sizeof(char)*init_capacity);
buffer->mode=o_mode;
buffer->inc_factor=inc_factor;

buffer->capacity=init_capacity;
buffer->addc_offset=0;
buffer->mark_offset=0;
buffer->r_flag=0;

return buffer;

}

上記の方法があります。私はそれを機能させようとしています。まず、いくつかの変数をチェックして設定します。いずれの場合も当てはまらない場合は、バッファーをNULLに設定し、呼び出し元の関数に値を返そうとしています。

else{
    buffer=NULL;
    return buffer;
}

ただし、その復帰後、関数は続行して先に進み、とにかくバッファ構造を作成します。returnステートメントが表示されたら、関数が終了することを期待していました。なぜ実行を継続するのですか?

4

1 に答える 1

4

この状態

1<=inc_factor<=255

常に真実です。として解析され(1 <= inc_factor) <= 2551 <= inc_factor0または1のいずれかに評価されます。したがって、o_mode'a'またはのいずれかである場合、が0または負'm'であっても、前の条件の1つが成り立ちます。inc_factor

条件連鎖を見ると、次のことがわかります。

if (o_mode=='f' || inc_factor==0){
    o_mode=0;
    inc_factor=0;
}else if (o_mode=='f' && inc_factor!=0){ // This is never true, because if o_mode == 'f',
    o_mode=0;                            // the first one already was true
    inc_factor=0;
}else if (o_mode=='a' && 1<=inc_factor<=255){ // This is just o_mode == 'a'
    o_mode=1;
    inc_factor=inc_factor;
}else if (o_mode=='m' && 1<=inc_factor<=100){ // This is just o_mode == 'm'
    o_mode=-1;
    inc_factor=inc_factor;
}
else{ // This is only reached if o_mode is none of 'f', 'a', 'm' and inc_factor is != 0
    buffer=NULL;
    return buffer;
}

ただし、とのいずれでもない場合はo_mode、ファイナルに到達して返されます。ステートメントを無視するほど壊れた実装はありません。'f', 'a', 'm'inc_factor != 0elseNULLreturn

于 2012-09-24T22:31:36.727 に答える