C语言 关于指针,数组和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(鲍勃想知道爱丽丝的代码是否正确。他取消注释第 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( 使用适当的类型,见上文。

相关内容

  • 没有找到相关文章

最新更新