代码之家  ›  专栏  ›  技术社区  ›  Summer_More_More_Tea

c语言中数组维数的约束

c
  •  0
  • Summer_More_More_Tea  · 技术社区  · 15 年前
    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。 提前谢谢!

    2 回复  |  直到 15 年前
        1
  •  7
  •   anon    15 年前

    在C99中,使用变量作为维度定义数组的能力被添加到C中。它还支持一些C++编译器的扩展,但不是C++标准的一部分,也不会是C++ 0x的一部分。如果您打算对C89编译器或C++进行移植,最好不要使用它。

        2
  •  2
  •   Eli Bendersky    15 年前

    补充尼尔的回答:这个特性叫做vla- Variable Length Array . 它确实是在C99中添加的,目前由多个编译器支持。不鼓励使用 other reasons 另外,除了尼尔提到的可移植性问题之外