Lordy, Lordy. To all those suggesting ways to actually perform the exchange, please read the question carefully; there's nothing worse than having to reiterate an already perfectly articulate question. Irrespective of the method used to implement the exchange (temp-swap, xor3-swap, etc), this person appears to be all too familiar with the function's fundamental and rather elementary intrinsics.
However, as already explained, the compiler/linker generically places all string literals within the 'const data-segment' of the target executable, which is subsequently associated with a non-writeable MMU descriptor during the appropriate 'load/exec' invocation. All CPU write-cycles subsequently issued via this descriptor are automatically trapped by the MMU's exception mechanism, resulting in the obligatory 'segfault' or platform-specific equivalent. It goes without saying of course, older non-MMU platforms would exhibit no such behaviour.
Although this effectively procures run-time support for the source language's 'constant/literal' idiom, several platforms have historically facilitated explicit compile-time segment overrides. However, this level of support has slowly diminished in favour of a more rigid/robust abstraction layer, thus rendering many obvious and often useful optimisations untenable. As time and attrition yields its steadily ageing "MC/ASM" philosophy before an all too eager "Microsoft" generation, programmers are no longer deemed knowledgeable or responsible enough to make this kind of decision. In lieu of the many contrived, not to say creative, implementations I have witnessed as a project leader, this is by no means a bad thing.
Although this post is rapidly evolving into an off-topic violation, I feel somewhat vindicated by the constant stream of top-down related questions which are slowly becoming endemic within our industry. As a fledgling C programmer - a language originally designed to complement low-level development - my advice is to adopt a bottom-up approach and augment your studies with a little extra-curricular assembly language development. As algorithmic implementation is likely to constitute your primary focus as an applications engineer, it is important to remember that contemporary CPU design has experienced a homogeneous evolution over the past 30 years; today's ultra-fast Intel CPUs are no more than super-scalar CMOS refinements of the 4/8-bit bipolar processors I was programming when the Earth was still young.
Contrary to popular belief, assembly language programming is relatively easy to learn, and absolutely essential when attempting to reconcile high-level constructs with problematic or esoteric behaviour. Once you factor in the endless hours of experimentation, debugging, web-searching and forum-spamming, there can be no doubt that a bottom-up approach is certainly the path of least resistance.
Good luck with your studies.