gpt4 book ai didi

c++ - 为什么两个声明的 char* 变量获得相同的地址?

转载 作者:太空狗 更新时间:2023-10-29 21:21:23 27 4
gpt4 key购买 nike

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 **   0x00007fff5fbff928argc      int             1complete  char *          0x00007fff5fbff928*complete char            'b'sub       char *          0x00007fff5fbff928*sub      char            'b'&complete char **         0x00007fff5fbff8e8&sub      char **         0x00007fff5fbff8e0

为什么这两个变量被分配了相同的地址?我在这里错过了什么? (为什么他们保留与 argv 相同的地址,我认为这只是为了与 CLI 接口(interface)?)

他们甚至保留相同的地址吗? (我自己将最后两行 (&) 添加到调试器中。它们显示不同的地址...)

最佳答案

你在那里做的是未定义的行为,因为 completeStringsubstring 都没有指向实际分配的内存。任何事情都可能发生;)

更准确地说:很可能因为你没有给局部变量赋值,所以它们只是得到位于堆栈上的第一个值,这可能是随机的或者你的 libc< 的初始化 留在那里。

关于c++ - 为什么两个声明的 char* 变量获得相同的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22588558/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com