I suggest to define the call as follows, because matrices with variable arguments are not supported in C and C++.
void edges(int height, int width, RGBTRIPLE **image)
{
RGBTRIPLE **copy = AllocRGBTripple(height, width);
for (int i=0; i<height; i++) { ...
The call would then look like this:
int height = 20, width = 20;
RGBTRIPLE **image = AllocRGBTripple(height, width);
edges(height, width, image);
With the function AllocRGBTripple() you would then of course have to get enough memory e.g. with calloc() and initialize it. If the memory is no longer needed it should be freed with free().