Les Bleus were already through to the knockout stages and the point, combined with Australia's defeat to Peru, ensured that Denmark would join them as runners-up.
Didier Deschamps made six changes to his France starting lineup who again failed to justify why they are among the tournament favourites with a disappointing display.
A half-hearted penalty appeal apiece was as exciting as the opening 25 minutes got in Moscow. Middlesbrough's Martin Braithwaite felt that he was felled as he burst into the box, while France wanted a handball against Mathias Jorgensen, when the ball struck the Huddersfield Town defender under the armpit.
Kasper Schmeichel was called into action by Olivier Giroud and Antoine Griezmann in the first half, but was never seriously stretched. Young defender Presnel Kimpembe could have troubled the Leicester City goalkeeper, but he could not direct his free header from Thomas Lemar's 17th-minute corner on target.
Knowing that a point would see them through, the Danes were content to sit back and hope that talisman Christian Eriksen, who had scored 17 goals in his last 20 internationals, could produce something spectacular.
The Tottenham Hotspur playmaker was on the periphary of the game, but did have arguably the best chance of the opening 45 minutes when Andreas Cornelius slid across a perfectly-weighted ball which was smothered by France goalkeeper Steve Mandanda, after hesitation from Eriksen.
Ousmane Dembele was one of the players given an opportunity by Deschamps but he failed to make an impression. The Barcelona forward at least showed some intent with a couple of long-range shots but the quality was badly lacking.
A second Peru goal against Australia in Sochi three minutes into the second half allowed the Danes to relax even more, and it quickly became clear that both teams were content to settle for the draw that would see their respective objectives achieved.
Eriksen did try his best to liven up a stale encounter, testing Mandanda with a dipping free kick which bounced just in front of him and nearly fell to Cornelius on the rebound. A poor defensive header from Djibril Sidibe also set up the Spurs star for a half-volley that he dragged wide.
The 70th-minute introduction of Nabil Fekir brought some much-needed impetus to France's play, with the Lyon midfielder ruffling the side-netting with a speculative left-footed shot from a difficult angle, moments after replacing Griezmann who was once again well below his best.
Fekir aimed to break the deadlock again when he drifted in from the right and bent a shot towards the bottom corner which Schmeichel pushed away, and, despite his best efforts, this year's tournament witnessed its first goalless draw in 38 matches.
France and Denmark now wait to learn their last-16 opponents as the fate of Group D is decided this evening.
DENMARK (4-4-1-1): Schmeichel; Dalsgaard, Kjaer, Jorgensen,, Stryger; Braithwaite, Delaney (Lerager, 90'), Christensen, Sisto (Fischer, 60'); Eriksen; Cornelius (Dolberg, 70')
FRANCE (4-2-3-1): Mandanda; Sidibie, Kimpembe, Varane, Hernandez (Mendy, 50'); Kante, Nzonzi; Lemar, Griezmann (Fekir, 68'), Dembele (Mbappe, 78'); Giroud