I have the same problem and started out with the same approach as you did - checkbox to make the address the same and then greyed out fields.
However, I had two issues with this approach:
1) Users might want to copy an address just to get the same place and zipcode, then edit street and name. This would require them to check, then uncheck the box and the values should not be cleared.
2) In our process there are four different addresses, all of which can be the same - or not. (they may even be from a different country - don't ask for the headache that gives me...). Here, checkboxes are problematic for these mutually exclusive source addresses. Instead I would need use address X radios and a type new address radio to undo any selection The latter bugs me. It feels like baggage.
This brought me to consider a different solution: Instead of checkboxes or radios I currently use buttons to trigger a copy action. Fields start editable and remain so the whole time. The button is basically some sort of auto-fill to help speed up the process. Of course, if the user edits the data after copying, a second validation becomes necessary. Also, the copied address is not tied to the original one, so changes in one address do not affect the other (which might be a requirement in some cases).
However, depending on the nature of the address-input process this might be an alternative that is worth considering.