No, in C, break and continue are pretty much handled as gotos. their advantages are that the intent is clearer, and the locations to jump to are more restricted (in a way those are same advantage). Stack management is not something the user has access to: C implementations aren't required to even have a stack, but if they do they must handle it whatever the user writes. And dangling pointers aren't ever corrected, the user is responsible for tracking his pointers.
when you write an iteration statement, the compiler creates implicit labels for where to transfer control from a break or continue. this control transfer happens just like a goto to a named label.
for (x; y; z) { statements... _continue:; } _break:;
the same problem with uninitialized variables happens with switch statements too, because they are implemented just like goto:
int flag=1;
switch (flag) {
default:
struct hairy hs = {1, 2, 3, 4};
case 1:
operate(hs.b);
}
You can see that when you use switch, you are always "jumping in" to a compound statement, much as if you used goto to a label within. It is possible to use these features safely, it just presents more pitfalls and the code is brittle.