0

这是一个来自拼图的真实案例。

    #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) 另一个学生 Charlie 建议 Bob 和 Alice 使用一维数组来模拟二维数组。Bob 然后将上述代码的第 18 行修改如下。

int * array=malloc ( sizeof ( int ) *ROWS *COLS ) ;

他应该对其余代码进行哪些进一步修改?让我们假设 Alice 想要回退到她原来的实现。

请给我帮助。非常感谢。

4

1 回答 1

1

您有一个类型不匹配的典型案例。int ** array;不一样int array[5][6];。第一个给你一个取消引用,第二个给你一个 6 sint*的数组。int

(a) Bob 会SIGSEGV相对较快地得到 a,因为他定义了 a int **,但 Alice 的函数需要 a 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) 使用适当的类型,见上文。

于 2013-09-02T14:37:24.527 回答