Ok sorry I probably didn't explain very well.
Basically the addresses on the on-chip flash must be dword aligned. Therefore the address must be divisible by 4 and produce an integer result.
The address you are trying to write to 0x3f7ff is 260095 in decimal which when you divide by 4 comes out as 65023.75 which as you can see is not an integer, therefore it will not work properly.
Strangely in your example code you have commented out an address at the top which is dword aligned and therefore should work correctly.
unsigned long address = 0x4403f7ff; //0x4403f800;
On every write you must check the alignment of the address first and align it if it needs to be.
Say for example you start at address 0x3f800 which is aligned and you write one byte this will move the address to 0x3f801 which is not dword aligned, if you used this address then you would get the error you are seeing, however if before you do the next write you align the address to the next dword boundary I.E 0x3f804 then everything will be fine.
To get the most out of your memory it's best to try and do your writes so that everything is naturally dword aligned else you will end up wasting space in flash because of having to leave blank space.
Hope this makes more sense