简体   繁体   中英

Why are two declared char* variables getting the same address?

TL;DR: Why do my char* variables have the same value, even though I input different ones?

Consider this very short program:

char *GetCompleteString ()
{
    char *completeString;
    std::cout << "Please enter the complete string.\n";
    std::cin.getline(completeString,100);
    return completeString;
}

char *GetSubstring ()
{
    char* substring;
    std::cout << "Please enter the substring for which to search.\n";
    std::cin.getline(substring,100);
    return substring;
}


//////////////////////////////////////////////////
int main(int argc, const char * argv[])
{
    char *complete, *sub;

    complete = GetCompleteString();
    sub = GetSubstring();
    //diagnostic
    std::cout << "Complete is " << complete << " and sub is " << sub;
    //diagnostic

    return 0;
}

Now, I enter "foo" for the first string, and "bar" for the second. But the output tells me that both variables are the same.

The Xcode debugger shows that both variables have the same address, so when I assign a value to bar, the previously-entered foo (which lives at the same address) takes the same value. Here's what the debugger pane is showing just before the program exits:

argv      const char **   0x00007fff5fbff928
argc      int             1
complete  char *          0x00007fff5fbff928
*complete char            'b'
sub       char *          0x00007fff5fbff928
*sub      char            'b'
&complete char **         0x00007fff5fbff8e8
&sub      char **         0x00007fff5fbff8e0

Why are these two variables being assigned the same address? What am I missing here? (And why are they retaining the same address as argv, which I think is just for interfacing with the CLI?)

And are they even retaining the same addresses? (I added the last two (&) lines to the debugger, myself. And those show different addresses...)

What you are doing there is undefined behaviour since neither completeString nor substring point to actual allocated memory. Anything can happen ;)

To be more precise: It is very likely that since you don't assign a value to the local variables they just get the first value lying on the stack which could be random or something the initialisation of your libc left there.

You can use following updated code

char *GetCompleteString ()
{
    char *completeString = (char*)malloc(sizeof(char)*numberofchars);
    std::cout << "Please enter the complete string.\n";
    std::cin.getline(completeString,100);
    return completeString;
}

char *GetSubstring ()
{
    char* substring =  (char*)malloc(sizeof(char)*numberofchars);
    std::cout << "Please enter the substring for which to search.\n";
    std::cin.getline(substring,100);
    return substring;
}


//////////////////////////////////////////////////
int main(int argc, const char * argv[])
{
    char *complete, *sub;

    complete = GetCompleteString();
    sub = GetSubstring();
    //diagnostic
    std::cout << "Complete is " << complete << " and sub is " << sub;
    //diagnostic

    return 0;
}

I have added memory allocation calls in your functions. numberofchars is numbers of chars you expect in that char *, or you can give some more thought to make it dynamic

There are a few problems with your code. I will list them here -

  1. The statement char *completeString; defines completeString to be a pointer to a character. What you need is a character array to store the string entered by the user.

  2. The variable completeString and subString are local to the functions GetCompleteString and GetSubstring respectively. They are allocated on the stack and go out of scope when the function returns. If you try to access them in main , then this invokes undefined behaviour. You need to allocate space to store strings on the heap using new operator. This allocates memory on the heap. You should free this memory using the delete[] operator after you are done with it.

  3. The signature of main as per the standard should be one of the following - int main(); or int main(int argc, char *argv[]);

Applying these changes to your code, it is

#include <iostream>

#define MAX_LEN 100  

char *GetCompleteString()
{
    char *completeString = new char[MAX_LEN];
    std::cout << "Please enter the complete string.\n";
    std::cin.getline(completeString, MAX_LEN);
    return completeString;
}

char *GetSubstring()
{
    char* substring = new char[MAX_LEN];
    std::cout << "Please enter the substring for which to search.\n";
    std::cin.getline(substring, MAX_LEN);
    return substring;
}

int main()
{
    char *complete, *sub;

    complete = GetCompleteString();
    sub = GetSubstring();

    std::cout << "Complete is " << complete << " and sub is " << sub;

    delete[] sub;
    delete[] complete;

    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM