这是一个来自谜题的真实案例。
#include <stdio.h>
#include <stdlib.h>
#define ROWS 10
#define COLS 8
void process_array(int array[ROWS][COLS]) {
int i,j, count =0;
for (i=0; i< ROWS ;i++)
for(j=0 ; j<COLS; j++)
array[i][j]= count++;
}
int main() {
int **array = malloc( sizeof(int)*ROWS*COLS);
process_array(array);
/** int i,j;
for (i=0; i< ROWS ;i++){
for(j=0 ; j<COLS; j++)
printf("%d ",array[i][j]);
printf("n");
}
**/
return 0;
}
问题。
(a(鲍勃想知道爱丽丝的代码是否正确。他取消注释第 21 行的代码到 26 行以输出数组的内容。他会得到什么结果?
(b(爱丽丝坚持她的代码是绝对正确的(这是真的(。怎么能如果 Bob 确实需要通过以下方式访问主函数中的数组,他解决了问题下标运算符(即array[i][j]
(?
(c( 爱丽丝将她的函数签名更改为
void process_array (int ** array ) ;
鲍勃应该对主函数进行哪些相应的修改?
(d(另一个学生查理建议鲍勃和爱丽丝使用一维数组来模拟二维数组。然后,Bob 将上述代码的第 18 行修改为遵循。
int * array=malloc ( sizeof ( int ) *ROWS *COLS ) ;
他应该对代码的其余部分进行哪些进一步的修改?让我们假设 Alice 想要回退到她的原始实现。
请给我一个帮助。多谢。
您有一个典型的类型不匹配的情况。 int ** array;
与int array[5][6];
不同。第一个为您提供了取消引用的int*
,第二个是 6 int
s 的数组。
(a(鲍勃会相对较快地得到一个SIGSEGV
,因为他定义了一个int **
,但爱丽丝的函数需要一个int (*)[COLS]
,而这正是鲍勃实际分配内存的目的。
(b( 鲍勃需要将array
定义为
int (*array)[COLS] = malloc( sizeof(int)*ROWS*COLS);
或者只是将其分配给堆栈
int array[ROWS][COLS];
(c( 为每一行分配内存。
int ** array = malloc( sizeof(int*) * ROWS);
size_t i;
for (i = 0; i < ROWS; i++)
array[i] = malloc(sizeof(int) * COLS);
(d( 使用适当的类型,见上文。