将一个char指针分配给另一个(不同的地址)

时间:2015-09-05 07:16:12

标签: c++ pointers memory-address

如果我这样做,我希望这两个指针共享相同的地址:

char* foo, * bar=new char;
// or even
// char* foo=new char, * bar=new char;

bar = "Bar string";
foo = bar;

cout << "Foo: " << foo << " (" << &foo << ")" << endl;
cout << "Bar: " << bar << " (" << &bar << ")" << endl;

Output:
Foo: Bar string (0049F890)
Bar: Bar string (0049F884)

然而,我得到的两个地址略有不同(但不同)。是否有类似&#34;明确&#34;为这样的案件分配?并非我真的需要它,我调查了为什么当我指定一个地址等于另一个地址时,他们最终会有不同的地址

3 个答案:

答案 0 :(得分:2)

&foo&bar变量的地址。因为有两个变量,所以它们具有不同的地址。

两个变量所持有的值虽然相同。通过测试确认

foo == bar

对于它的价值,使用new毫无意义,因为你立即丢弃返回的值,从而泄漏内存。它应该是

char *bar = "Bar string";
char *foo = bar;
cout << foo == bar << endl;

答案 1 :(得分:1)

您没有打印(char *)地址foo和bar指向。

这是由于<<运算符的重载定义:

  • 传递char*(第一种情况)打印它指向的字符串。对于任何其他指针类型,它将打印指针地址。但是对于char*,行为是特殊的:它打印指向的值。
  • 传递char**(第二种情况)打印其原始值,即指向char的指针。这是传递除char*
  • 之外的指针的运算符的默认行为

http://www.cplusplus.com/reference/ostream/ostream/operator-free/

http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/

这意味着您正在打印:

  • 字符串foo和bar指向(第一种情况)
  • 包含foo和bar的变量的地址。这些是堆栈变量,因为foo和bar是不同的变量,它们的地址是不同的

你可以将foo和bar强制转换为void*,以便将它们的值打印为原始指针:

cout << "Foo: " << foo << " (" << (void*)foo << ")" << endl;
cout << "Bar: " << bar << " (" << (void*)bar << ")" << endl;

旁注:您在第一行的堆上分配一个char,然后将指针设置为另一个值,而不删除它们。因此,你正在泄露记忆。

答案 2 :(得分:0)

在您的示例中,您将打印存储barfoo可变品的地址。这两个变量都是指针,因此行为是相同的。

您可能正在寻找的是使用(void*)reinterpret_cast()reinterpret_cast<void*>(foo)将变量投射到reinterpret_cast<void*> (bar),这将打印的起始内存位置变量指向

#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    char* foo, *bar = new char;

    bar = "Bar string";
    foo = bar;

    cout << "Foo: " << foo << " (" << &foo << "," << reinterpret_cast<void*>(foo) << ")" << endl;
    cout << "Bar: " << bar << " (" << &bar << "," << reinterpret_cast<void*>(bar) << ")" << endl;

    return 0;
}