【问题标题】:multidimensional array: incompatible type assignment多维数组:不兼容的类型赋值
【发布时间】:2012-06-09 04:10:00
【问题描述】:

我已经声明了已知大小的数组,

typedef struct{
  ......
  char * buffer[height+1];    //height is a constant int
  ......} args;

int main{
 args * info;
 info = malloc (sizeof(args));
 char* output_buffer[width][height+1];    //width is also a constant int >= 4
 output_buffer[2] = malloc (sizeof(char)*char_per_line*(height+1)); // error same as below
 info->buffer = output_buffer[2];    // I know it's wrong. incompatible types in assignment
....}

数字是任意的,仅用于说明。

我所做的是将output_buffer[width]的地址分配给info->buffer,然后将info作为参数传递给一个线程,该线程生成一个大小为height+1的数据数组;每个插槽中都有一个长度为 char_per_line 的 cstring。这些 cstrings 存储在output_buffer[2]

我在这里感到困惑,这不是output_buffer[2] 类型为char*[height+1] 的指针吗?那为什么我不能将malloc的内存地址分配给它呢?

另外,我知道我不能将数组分配给数组,但我怎样才能让代码以所需的方式工作?如果解决方案是使用char** 作为char*[height+1],那么我该如何访问info->buffer[height],比如说?

提前致谢!

【问题讨论】:

    标签: c multidimensional-array variable-assignment


    【解决方案1】:

    根据您指定的要求,这是您需要做的

    /* This is a 2D array of pointers. */
    char* output_buffer[width][height+1]; 
    
    for ( int i =0; i< width; i++ )
        for ( int j=0; j <height+1; j++ )
            output_buffer[i][j] = malloc (sizeof(char)*char_per_line*(height+1));
    

    然后,

    info->buffer[SOME_VALUE] =  output_buffer[SOME_WIDTH][SOME_HEIGHT];  
    

    我在这里感到困惑,这不是 output_buffer[2] 类型的指针 字符* [高度+1]?那为什么我不能从 malloc 分配内存地址 给它?

    malloc 返回一个单维指针 void* 但正如您所指出的, output_buffer[2] 不是一个单维指针。它的类型为char*[height+1][]* 之外增加了一个维度。

    【讨论】:

    • 是的,这行得通。谢谢!但是我仍然在考虑立即分配而没有循环。有没有办法做到这一点?
    • @AoZ 你可以,但是你声明一个二维指针数组(output_buffer)有什么用呢?如果有数组,恐怕就无法避免循环了
    【解决方案2】:
    typedef struct{
      ......
      char * buffer[height+1];    //height is a constant int
      ......} args
    

    这是必须的

    typedef struct{
      ......
      char ** buffer;    //height is a constant int
      ......} args
    
    output_buffer[2] = malloc (sizeof(char)*char_per_line*(height+1));
    

    您必须在 for 循环中执行此操作,并且对于所有 output_buffer[i][j],(现在是 char ** = char *)。

    【讨论】:

      【解决方案3】:

      output_buffer[2] 不是 char*[height+1] 类型的指针吗?

      没有。 output_buffer[2] 是一个大小为 height+1 的数组。它的元素类型是char*

      那为什么我不能将 malloc 的内存地址分配给它呢?

      如您所知,您不能分配给数组。

      大小为height+1的数组;每个插槽中都有一个长度为 char_per_line 的 cstring。

      我怎样才能让代码以所需的方式工作?

      如果需要(height+1)C 字符串数组,每个大小为char_per_line,则需要分配(height+1) C 字符串,大小为char_per_line。也就是说,调用malloc(height+1) 次并将char_per_line 传递给每个人。 (有一种方法可以在一次调用 malloc 时完成,但您现在可能不想这样做)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 2013-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        相关资源
        最近更新 更多