1

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

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
....}

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

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

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

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

提前致谢!

4

3 回答 3

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] 不是 char*[height+1] 类型的指针吗?那为什么我不能从 malloc 分配内存地址呢?

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

于 2012-06-05T06:18:17.783 回答
1

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

No.output_buffer[2]是一个 size 的数组height+1。它的元素类型是char*

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

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

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

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

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

于 2012-06-05T06:41:11.880 回答
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 *)。

于 2012-06-05T06:31:04.393 回答