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

为什么这些C/Cython数组被定义为字符数组,而不是整数数组?

  •  0
  • flow  · 技术社区  · 14 年前

    #3367795 在这里,我必须处理一些子问题。其中之一是:在所述算法(levenshtein距离)中,在内存中分配多个数组并用行初始化

    cdef char   *m1     = <char *>calloc(   blen + 2,    sizeof( char ) )
    cdef char   *m2     = <char *>calloc(   blen + 2,    sizeof( char ) )
    cdef char   *m3     = <char *>malloc( ( blen + 2 ) * sizeof( char ) )
    #.........................................................................
    for i from 0 <= i <= blen:
      m2[ i ] = i
      <...snip...>
    

    blen bytes 变量。现在就我所了解的算法(完整的代码请参阅我原来的帖子)和 m2 很明显,这些数组是用来保存整数的,而不是字符,所以人们会认为正确的分配应该是这样的

    cdef int    *m3     = <int *>malloc( ( blen + 2 ) * sizeof( int ) )
    

    等等。有C语言背景的人能告诉我为什么吗 char <char *> ? 有人会这么想 char *x = malloc( ... ) 应该足以定义 x .

    2 回复  |  直到 8 年前
        1
  •  2
  •   John Machin Santi    14 年前

    很简单,为了节省内存——但请注意,将这些数组声明为 char 将结果距离限制为127或255,这取决于C编译器是否默认为 signed char unsigned char 分别。在C中, 烧焦 ord() 获取其整数值。

    您的原始代码没有提到此限制。 注意,如果 溢出时,它会静默地执行此操作,代码将产生不正确的结果

    你没有回应我对你最初问题的评论:“你的字符串的(a)最大(b)平均大小是多少?”?如果这两个字符串完全不同,你真的需要做整个O(M*N)的事情吗?“。。。。。请现在回答(编辑你的问题);如果你当时这样做了,这个问题那时就有答案了。

    m1, m2 = m2, m1
    strcpy( m3, m2 )
    

    有三个理由是错误的:(1)它没有正确地洗牌行(应该这样做) strcpy() m1 m2 ) (2) strcpy() 不会复制超出第一个空值(零字节)的任何内容(3)不需要复制任何内容,只需洗牌指针

    m3, m2, m1 = m2, m1, m3
    
        2
  •  8
  •   AnT stands with Russia    14 年前

    尽管名字有误导性, char C语言中的类型是普通的 类型,就像 short , int long 诸如此类。在所有积分类型中, 烧焦 s的范围最小,占用的内存量最小。因此,如果在应用程序中尽可能多地保存内存很重要,那么使用 烧焦 内景 .

    在某些硬件平台上,结果可能是 类型比 烧焦 类型,因此选择特定类型成为速度与内存的权衡,但是,在许多情况下,当 烧焦 自然就足够了,使用它可能更有意义 而不是 内景