C 当我访问(表->;数组[i][i])时获取运行时错误。最小值=(表->;数组[i][i])。最大值=arr[i];
我使用DP填充一个表,其中包含数组中从索引I到索引j的最大和最小项。这种方法是否有效,对我来说不是问题。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
考虑下面的代码片段:
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;
}