Kiwi
Kiwi

Reputation: 1093

Simple modification of C strings using pointers

I have two pointers to the same C string. If I increment the second pointer by one, and assign the value of the second pointer to that of the first, I expect the first character of the first string to be changed. For example:

#include "stdio.h"

int main() {
  char* original_str = "ABC";        // Get pointer to "ABC"
  char* off_by_one = original_str;   // Duplicate pointer to "ABC"
  off_by_one++;                      // Increment duplicate by one: now "BC"
  *original_str = *off_by_one;       // Set 1st char of one to 1st char of other
  printf("%s\n", original_str);      // Prints "ABC" (why not "BBC"?)
  *original_str = *(off_by_one + 1); // Set 1st char of one to 2nd char of other
  printf("%s\n", original_str);      // Prints "ABC" (why not "CBC"?)

  return 0;
}

This doesn't work. I'm sure I'm missing something obvious - I have very, very little experience with C.

Thanks for your help!

Upvotes: 3

Views: 4131

Answers (2)

James McNellis
James McNellis

Reputation: 355167

You are attempting to modify a string literal. String literals are not modifiable (i.e., they are read-only).

A program that attempts to modify a string literal exhibits undefined behavior: the program may be able to "successfully" modify the string literal, the program may crash (immediately or at a later time), a program may exhibit unusual and unexpected behavior, or anything else might happen. All bets are off when the behavior is undefined.

Your code declares original_string as a pointer to the string literal "ABC":

char* original_string = "ABC";

If you change this to:

char original_string[] = "ABC";

you should be good to go. This declares an array of char that is initialized with the contents of the string literal "ABC". The array is automatically given a size of four elements (at compile-time), because that is the size required to hold the string literal (including the null terminator).

Upvotes: 10

Christian
Christian

Reputation: 4342

The problem is that you can't modify the literal "ABC", which is read only.

Try char[] original_string = "ABC", which uses an array to hold the string that you can modify.

Upvotes: 1

Related Questions