c++ dynamic array initialization with declaration

2020-01-29 08:33发布

问题:

I have function like this:

void findScarf1(bool ** matrix, int m, int n, int radius, int connectivity); 

and in main function I create 2d dynamic array to pass in this function

    bool matrix[6][7] = {
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0}
};

The problem is:

findScarf1(matrix, 6, 7, 3, 4);

causes error C2664: 'findScarf1' : cannot convert parameter 1 from 'bool [6][7]' to 'bool **'

How to initialize array compactly(simultaneously with declaration)?

p.s. sorry if it's duplicate question but I've spent 1.5 hours figuring it out

回答1:

Technically, a 2D array is an array of 1D arrays. So it cannot convert into pointer to pointer. It can convert into pointer to array, though.

So this should work:

void findScarf1(bool (*matrix)[7], int m, int n, int radius, int connectivity); 

Here bool (*matrix)[7] declares a pointer to array of 7 bool.

Hope that helps.



回答2:

If you look at how your array is laid out in memory, and compare it how a pointer-to-pointer "matrix" is laid out, you will understand why you can't pass the matrix as a pointer to pointer.

You matrix is like this:

[ matrix[0][0] | matrix[0][1] | ... | matrix[0][6] | matrix[1][0] | matrix[1][1] | ... ]

A matrix in pointer-to-pointer is like this:

[ matrix[0] | matrix[1] | ... ]
  |           |
  |           v
  |           [ matrix[1][0] | matrix[1][1] | ... ]
  v
  [ matrix[0][0] | matrix[0][1] | ... ]

You can solve this by changing the function argument:

bool (*matrix)[7]

That makes the argument matrix a pointer to an array, which will work.


And by the way, the matrix variable you have is not dynamic, it's fully declared and initialized by the compiler, there's nothing dynamic about it.



回答3:

You may define the function as:

void findScarf1(bool * matrix, int m, int n, int radius, int connectivity);

Or

void findScarf1(bool matrix[][7], int m, int n, int radius, int connectivity);

No matter how many dimensions an array has, it's just a block of linear memory.

When you use the first manner, you may need to do a cast when call this function:

findScarf1((bool *)marix, 6, 7, 3, 4);


回答4:

My Following example may be helpful for you:

#include<stdio.h>
void f(int (*m)[7]){  // As Nawaz answred
 printf("%d\n", m[3][3]);

}
void _f(int m[6][7]){ // As I commented to your question
 printf("%d\n", m[3][3]);

}
void _f_(int m[][7]){// Second form of Nawaz's answe 
 printf("%d\n", m[3][3]);

}
void f_(int (*m)[6][7]){// Pointer of 2D array
 printf("%d\n", (*m)[3][3]);
}

int main(){

    int matrix[6][7] = {
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 3, 1, 0, 0},
    {0, 0, 1, 4, 1, 0, 0},
    {0, 0, 1, 5, 1, 0, 0},
    {0, 0, 1, 6, 1, 0, 0},
    {0, 0, 1, 7, 1, 0, 0}
    };
    f(matrix);
    _f(matrix);
    _f_(matrix);    
    f_(&matrix);
    return 1;
}    

question not tanged to c, but I compiled with gcc (I have not installed g++).

~$ gcc  -Wall -pedantic 2d.c
~$ ./a.out 
5
5
5
5

I was not intended to post an answer, but because I commented wrong to Nawaz answer so during an experiment I written this code.

Here one can find it working at codepacde