这是一个真实的案例。
#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)Bob想知道Alice的代码是否正确。他取消了第21行的代码 到第26行输出数组的内容。他会得到什么结果?
(b)Alice坚持认为她的代码绝对正确(这是真的)。怎么能
如果Bob确实需要通过主要功能访问主要功能中的数组,他就解决了这个问题
下标运营商(即array[i][j]
)?
(c)Alice将其功能签名更改为
void process_array (int ** array ) ;
Bob应该对主要功能做出相应的修改是什么?
(d)另一名学生查理建议鲍勃和爱丽丝使用一维数组 模拟二维数组。然后Bob将以上代码的第18行修改为 如下:
int * array=malloc ( sizeof ( int ) *ROWS *COLS ) ;
他应该对其余代码做出哪些进一步的修改?让我们 假设Alice想要回归原来的实现。
请给我一个帮助。谢谢。
答案 0 :(得分:1)
您有典型的类型不匹配的情况。 int ** array;
与int array[5][6];
不同。第一个是解除引用的int*
,第二个是6个int
的数组。
(a)Bob会相对快速地获得SIGSEGV
,因为他定义了int **
,但Alice的函数需要int (*)[COLS]
,这就是Bob实际为其分配内存的。
(b)Bob需要将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)使用适当的类型,见上文。