C 当我访问(表->;数组[i][i])时获取运行时错误。最小值=(表->;数组[i][i])。最大值=arr[i];

C 当我访问(表->;数组[i][i])时获取运行时错误。最小值=(表->;数组[i][i])。最大值=arr[i];,c,malloc,structure,runtime-error,dynamic-memory-allocation,C,Malloc,Structure,Runtime Error,Dynamic Memory Allocation,我使用DP填充一个表,其中包含数组中从索引I到索引j的最大和最小项。这种方法是否有效,对我来说不是问题。 考虑下面的代码片段: typedef struct Slot { int min; int max; }Slot; typedef struct Table { Slot* *array; int size; }Table; Table* createTable( int size ) { Table* table = malloc( sizeof

我使用DP填充一个表,其中包含数组中从索引I到索引j的最大和最小项。这种方法是否有效,对我来说不是问题。
考虑下面的代码片段:

typedef struct Slot
{
    int min;
    int max;
}Slot;

typedef struct Table
{
    Slot* *array;
    int size;
}Table;

Table* createTable( int size )
{
    Table* table = malloc( sizeof( Table ) );

    if( !table )
            return NULL;

    table->array = ( Slot(*)[size] ) malloc( size * size * sizeof( Slot ) );

    if( !(table->array) )
                    return NULL;

    table->size = size;

    return table;
}

void foo( int arr[], int size )
{
    Table* table = createTable( size );

    if( table == NULL )
    {
            printf( "Out of memory" );
            return;
    }

    int i;

    for( i = 0; i < size; ++i )
            (table->array[i][i]).min = (table->array[i][i]).max = arr[i]; <----------
}
typedef结构插槽
{
int-min;
int max;
}槽;
typedef结构表
{
插槽**阵列;
整数大小;
}表;
表*createTable(整数大小)
{
表*表=malloc(sizeof(表));
如果(!表)
返回NULL;
表->数组=(插槽(*)[size])malloc(大小*大小*大小(插槽));
如果(!(表->数组))
返回NULL;
表->尺寸=尺寸;
返回表;
}
void foo(整数arr[],整数大小)
{
Table*Table=createTable(大小);
如果(表==NULL)
{
printf(“内存不足”);
返回;
}
int i;
对于(i=0;i(table->array[i][i])。min=(table->array[i][i])。max=arr[i];array[i][i])。min=(table->array[i][i])。max=arr[i];二维数组
插槽的
malloc
错误:

table->array = ( Slot(*)[size] ) malloc( size * size * sizeof( Slot ) );
您应该这样做,而不是这样做:

 table->array = (Slot**) malloc(sizeof(Slot*));
   for (int i = 0; i < ArraySizeX; i++)
        table->array[i] = (Slot*) malloc(ArraySizeY*sizeof(Slot));
这将正确分配双数组

然后,这个构造:

  for( i = 0; i < size; ++i )
     (table->array[i][i]).min = (table->array[i][i]).max = arr[i];
for(i=0;i数组[i][i]).min=(表->数组[i][i]).max=arr[i];
你真的应该一次做一项作业:

  for( i = 0; i < sizeX; ++i )
  {
      (table->array[i][i]).max = arr[i];
      (table->array[i][i]).min = (table->array[i][i]).max;
  }
(i=0;i { (表->数组[i][i])。max=arr[i]; (表->数组[i][i]).min=(表->数组[i][i]).max; }
如何在最少的malloc调用中为2D数组分配内存以作为数组[i][j]进行访问?关于嵌套循环,我只想填充对角线槽。这就是我使用一个循环的原因。@Aashish ah ok关于嵌套循环。我不能从你的问题中推断出来。好吧,这是填充2D数组的唯一方法。我不认为可以用更少的
malloc
调用来完成。我们可以使用单个ma为2D数组分配内存lloc呼叫。我刚刚检查过。如果有问题,请告诉我。@Aashish我已更正,对不起。您只需一次呼叫
malloc
。我编辑了我的答案。否,“您的表中只有一个插槽*”无法工作。请参见此处:。它仍会出现运行时错误。我的建议适用于将内存分配给类型转换指针的情况。请参阅前面的ideone链接。
  for( i = 0; i < size; ++i )
     (table->array[i][i]).min = (table->array[i][i]).max = arr[i];
  for( i = 0; i < sizeX; ++i )
  {
      (table->array[i][i]).max = arr[i];
      (table->array[i][i]).min = (table->array[i][i]).max;
  }