Home > Net >  A pointer variable being initiated, not as a const is bad, I get that, but underneath everything, wh
A pointer variable being initiated, not as a const is bad, I get that, but underneath everything, wh

Time:10-05


Im a CS student, but I have some experience as a developer as well, which sometimes can make things more difficult, as demonstrated below.In my class my professor asked us to never use the following statement...



    char* str = "Hello world";


According to the Professor...

"This is dangerous (and officially deprecated in the C standard) because you haven't allocated memory for str1 to point at."

I get that its bad, I don't care about that. The statement clearly demonstrates that I am failing to understand the way memory allocation works in regards to the C language. The statement can be ran, even if its deprecated, but I don't what I don't understand, is that if it is not allocating memory to the heap, it wouldn't make sense that it would allocate a variable initialization to the stack, which is where I get confused. Is there another area of memory, or like a cache that C uses specifically for local variable initialization? Where does the string Hello World get placed, and what address is assigned to the pointer in this case?

CodePudding user response:

The problem is in lvalue and rvalue. lvalue defines locator value and it means that it has a specified place in memory and you can easily take it. rvalue has undefined place in memory. For example, any int a = 5 has 5 as rvalue. So you cannot take the address of an rvalue. When you try to access the memory for char* str = "Hello World" with something like str[0] = 'x' you will get an error Segmentation fault which means you tried to get unaviable memory. Btw operators * and & are forbidden for rvalues, it throws compile time error, if you try to use them.

CodePudding user response:

Summary:

  • "any strings in double quotes" are const lvalue string literals, stored somewhere in compiled program.

  • You can't modify such string, but you can store pointer to this string (of course const) and use it without modifying:

    const char *str = "some string"

    For example:

    int my_strcmp(const char *str1, const char *str2) { ... }
    
    int main() 
    {
        ...
    
        const char *rule2_str= "rule2";
    
        // compare some strings
        if (my_strcmp(my_string, "rule1") == 0)
            std::cout << "Execute rule1" << std::endl;
        else if (my_strcmp(my_string, rule2_str) == 0)
            std::cout << "Execute rule2" << std::endl;
    
        ...
    }
    
  • If you want to modify string, you can copy string literal to your own array: char array[] = "12323", then your array will ititialize as string with terminate zero at the end:

    Actually char array[] = "123" is same as char array[] = {'1', '2', '3', '\0'}.

    For example:

    int main()
    {
        char my_string[] = "12345";
        my_string[0] = 5; // correct!
    
        std::cout << my_string << std::endl; // 52345
    }
    

    Remember that then your array will be static, so you can't change it's size, for "dynamic sized" strings use std::string.

  • Related