簡體   English   中英

約束C語言中的數組維數

[英]Constraint to array dimension in C language

int KMP( const char *original, int o_len, const char *substring, int s_len ){
if( o_len < s_len )
    return -1;

int k = 0;
int cur = 1;

int fail[ s_len ];

fail[ k ] = -1;

while( cur < s_len ){
    k = cur - 1;
    do{
        if( substring[ cur ] == substring[ k ] ){
            fail[ cur ] = k;

            break;
        }else{
            k = fail[ k ] + 1;
        }
    }while( k );    

    if( !k && ( substring[ cur ] != substring[ 0 ] ) ){
        fail[ cur ] = -1;
    }else if( !k ){
        fail[ cur ] = 0;
    }

    cur++;
}

k = 0;
cur = 0;

while( ( k < s_len ) && ( cur < o_len ) ){
    if( original[ cur ] == substring[ k ] ){
        cur++;
        k++;
    }else{
        if( k == 0 ){
            cur++;
        }else{
            k = fail[ k - 1 ] + 1;
        }
    }
}

if( k == s_len )
    return cur - k;
else
    return -1;
}

這是我曾經編碼的KMP算法。 當我今天早上回顧它時,我發現一個整數數組被定義為int fail [s_len]很奇怪。 規范是否要求數組的維數為編譯時常數? 此代碼如何通過編譯? 順便說一句,我的gcc版本是4.4.1。 提前致謝!

在C99中,將使用變量作為維度定義數組的功能添加到了C中。 一些C ++編譯器也支持將其作為擴展,但它不是C ++標准的一部分,也不會成為C ++ 0x的一部分。 如果您打算移植到C89編譯器或C ++,則最好不要使用它。

為了補充尼爾的答案:此功能稱為VLA- 可變長度數組 實際上,它確實是在C99中添加的,並且目前得到一些編譯器的支持。 除了Neil提到的可移植性問題外,還出於其他原因不鼓勵使用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM