Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Modifying String Literal [duplicate]

Tags:

c

Why is there no output when i run this program.

#include<stdio.h>

int main()
{
    char* t="C++";
    t[1]='p';
    t[2]='p';
    printf("%s",t);
    return 0;
}
like image 206
Sadique Avatar asked Mar 28 '11 19:03

Sadique


2 Answers

A C string literal creates an anonymous array of char. Any attempt to modify that array has undefined behavior. Ideally this would be enforced by making the array const, but C didn't always have const, and adding it to string literals would have broken existing code.

char* t="C++";

This is legal but potentially risky. The array containing the characters 'C', '+', '+', '\0' could be stored either in read-write memory or in read-only memory, at the whim of the compiler.

t[1]='p';

Here your program's behavior is undefined, because you're attempting to modify the contents of a string literal. The compiler isn't required to warn you about this, either at compile time or at run time -- nor is it required to do anything to make it "work".

If you want to let the compiler know that the string is read-only, it's best to add the const qualifier yourself:

const char *t = "C++";

The compiler should then at least warn you if you attempt to modify the string literal -- at least if you attempt to do so through t.

If you want to be able to modify it, you should make t a writable array:

char t[] = "C++";

Rather than making t a pointer that points to the beginning of "C++", this makes t an array into which the contents of "C++" are copied. You can do what you like with the contents of t, as long as you don't go outside its bounds.

Some more comments on your code:

#include<conio.h>

<conio.h> is specific to Windows (and MS-DOS). If you don't need your program to work on any other systems, that's fine. If you want it to be portable, remove it.

void main()

This is wrong; the correct declaration is int main(void) (int main() is questionable in C, but it's correct in C++.)

printf("%s",t);

Your output should end with a newline; various bad things can happen if it doesn't. Make this:

printf("%s\n", t);

(The question originally included this line just before the closing } :

getch();

The OP later removed it. This is Windows-specific. It's probably necessary to keep your output window from closing when the program finishes, an unfortunate problem with Windows development systems. If you want a more standard way to do this, getchar() simply reads a character from standard input, and lets you hit Enter to finish (though it doesn't give you a prompt). Or, if you're running the program either from an IDE or from a command prompt, most of them won't close the window immediately.)

Finally, since main returns a result of type int, it should actually do so; you can add

return 0;

before the closing }. This isn't really required, but it's not a bad idea. (C99 adds an implicit return 0;, but Microsoft doesn't support C99.) (Update in 2019: Microsoft's support for C99 features is slightly better. I'm not sure whether the return 0; is necessary.)

like image 186
Keith Thompson Avatar answered Oct 05 '22 20:10

Keith Thompson


"C++" is a string literal stored in read only location and hence cannot be modified. With this -

char* t="C++"; // t is pointing to a string literal stored in read only location

Instead, you should have -

char t[] = "C++" ;  // Copying the string literal to array t

to actually do -

t[1] = 'p' ;
like image 37
Mahesh Avatar answered Oct 05 '22 22:10

Mahesh