关于指针,数组和malloc

时间:2013-09-02 14:21:36

标签: c arrays pointers malloc

这是一个真实的案例。

    #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想要回归原来的实现。

请给我一个帮助。谢谢。

1 个答案:

答案 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)使用适当的类型,见上文。