多维数组:不兼容的类型赋值

时间:2012-06-05 05:53:34

标签: c multidimensional-array variable-assignment

我已声明已知大小的数组

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作为参数传递给线程,该线程生成数据大小为{{1 }};每个槽中都有一个长度为height+1的cstring。这些cstrings存储在char_per_line

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

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

提前致谢!

3 个答案:

答案 0 :(得分: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][]除了*之外还增加了一个维度。

答案 1 :(得分:1)

  

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

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

  

那为什么我不能从malloc中分配内存地址呢?

如您所知,您无法分配数组。

  

大小高度+ 1的数组;在每个槽中都是一个长度为char_per_line的cstring。

     

如何以期望的方式使代码工作?

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

答案 2 :(得分:0)

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 *)。