cpointerscharchar-pointer

Is String Literal in C really not modifiable?


As far as I know, a string literal can't be modified for example:

char* a = "abc";
a[0] = 'c';

That would not work since string literal is read-only. I can only modify it if:

char a[] = "abc";
a[0] = 'c';

However, in this post, Parse $PATH variable and save the directory names into an array of strings, the first answer modified a string literal at these two places:

path_var[j]='\0';
array[current_colon] = path_var+j+1;

I'm not very familiar with C so any explanation would be appreciated.


Solution

  • Code blocks from the post you linked:

    const char *orig_path_var = getenv("PATH"); 
    char *path_var = strdup(orig_path_var ? orig_path_var : "");
    
    const char **array;
    array = malloc((nb_colons+1) * sizeof(*array));
    array[0] = path_var;
    array[current_colon] = path_var+j+1;
    

    First block:

    Second block:

    As you can see, the code is not operating on const string literals like orig_path_var. Instead it uses a copy made with strdup(). This seems to be where your confusion stems from so take a look at this:

    char *strdup(const char *s);

    The strdup() function returns a pointer to a new string which is a duplicate of the string s. Memory for the new string is obtained with malloc(3), and can be freed with free(3).

    The above text shows what strdup() does according to its man page.

    It may also help to read the malloc() man page.