TL;DR:为什么我的 char* 变量具有相同的值,即使我输入了不同的值?
考虑这个非常短的程序:
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;
}
现在,我为第一个字符串输入“foo”,为第二个字符串输入“bar”。但是输出告诉我两个变量是相同的。
Xcode 调试器显示两个变量具有相同的地址,因此当我为 bar 赋值时,先前输入的 foo(位于相同地址)采用相同的值。这是程序退出前调试器 Pane 显示的内容:
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
为什么这两个变量被分配了相同的地址?我在这里错过了什么? (为什么他们保留与 argv 相同的地址,我认为这只是为了与 CLI 接口(interface)?)
他们甚至保留相同的地址吗? (我自己将最后两行 (&) 添加到调试器中。它们显示不同的地址...)
最佳答案
你在那里做的是未定义的行为,因为 completeString
和 substring
都没有指向实际分配的内存。任何事情都可能发生;)
更准确地说:很可能因为你没有给局部变量赋值,所以它们只是得到位于堆栈上的第一个值,这可能是随机的或者你的 libc< 的初始化
留在那里。
关于c++ - 为什么两个声明的 char* 变量获得相同的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22588558/