If the compiler complains about r->phy_addr[0] beng a pointer, then r->phy_addr must have pointer-to-pointer type (int ** most likely). In that case your problems begin even earlier. This
r->phy_addr = &array[0];
is already invalid, since you are assigning int * value to a int ** object. The compiler should have told you about it.
In other words, your call to add is not a problem. Forget about the call to add. It is too early to even look at that call. You have other problems that have to be solved well before that one.
What is r->phy_addr? Is it supposed to have int ** type? If so, why are you assigning it as shown above? Why are you ignoring compiler diagnostic messages triggered by that invalid assignment?
phy_addr?