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

标签 c++ string pointers char

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)?)

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

最佳答案

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

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

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

相关文章:

c - 添加 <windows.h> 时出现结构错误

java - 标准化图像描述符 OpenCV Java

c++ - 与另一个库交叉编译

java - 取10个全名(有多个名字)加上很多限制

java - 如何将 double 转换为具有 2 个小数位的字符串?

javascript - 使用 javascript 检索 url 查询字符串来解析 if/else 语句并重定向

c++ - 线路运算符(operator)新的段错误

c++ - 将 uint32_t 转换为 uint64_t 会产生不同的值?

c++ - 为什么 “i++ + 1”本身未定义?如何确保后缀的副作用在计算+之后发生?

c 程序,警告消息传递 ‘fstat’ 的参数 1 从指针生成整数而不进行强制转换