Chris Iwelumo gave Charlton a last-gasp victory for the second time in three days.
It was an injury-time header at Southampton on Saturday and this was another header on 90 minutes to send City to a first home defeat of the campaign.
Charlton had seen their early dominance whittled away, but when Lee Johnson missed a tackle for the home side, Andy Reid raced away to whip in a left-wing cross for a goal.
After ending a run of three defeats with their win at Southampton, Charlton were bursting to make up for lost points.
With Iwelumo stretching for everything in the air and winning most of them, they were constantly dangerous whenever Jerome Thomas broke on the left.
Between them they almost fashioned a second minute lead. Thomas' cross pierced City's defence but Iwelumo's side-foot was a shade too casual and Brazilian keeper Adriano Basso had time to drop on it.
Basso went on to keep his side in the game with a string of good stops in a busy first half which left City's midfield exposed.
Charlton were winning all the tackles and the midfield was theirs.
When Bradley Orr gave away a free-kick for one of several fouls on Thomas, Basso made a great leaping save to keep out Grant Basey's shot.
The keeper then denied Thomas after home skipper Louis Carey had been booked for bringing down rival captain Reid in full flight.
City's best chance came when Lee Trundle went by Jonathan Fortune, but his 20-yard chip was safely charted by keeper Nicky Weaver.
The Londoner's replaced Lloyd Sam with Luke Varney for the second half to give them extra pace.
There was more bite too with physical skirmishes bringing two cards for home players, while close to the end referee Scott Mathieson ordered two of Charlton manager Alan Pardew's backroom staff out of the dug-out.