C++11 地址函数总是返回相同的值

C++11 地址函数总是返回相同的值,c++11,C++11,我有一个名为“Address”的函数: template <class Variable> unsigned long Address(Variable *X){ return (unsigned long &) X; } 模板无符号长地址(变量*X){ 返回(无符号长&)X; } 此函数返回给定参数的地址。即使给出的论点也是错误的 不是一个变量,它返回一个值,当我把这个值指向另一个指针时,我可以访问这个值 当我使用这个函数时,我看到这个函数总是在非变量(比如“h

我有一个名为“Address”的函数:

template <class Variable> unsigned long Address(Variable *X){
    return (unsigned long &) X;
}
模板无符号长地址(变量*X){
返回(无符号长&)X;
}
此函数返回给定参数的地址。即使给出的论点也是错误的 不是一个变量,它返回一个值,当我把这个值指向另一个指针时,我可以访问这个值

当我使用这个函数时,我看到这个函数总是在非变量(比如“helloworld!”)参数上返回相同的值

cout << "Address (?) of 'Hello world!' :" << Address("Hello world!") << "\n";

cout字符串文本的地址完全依赖于编译器。在您的例子中,两个独立的程序各自编译一个*字符串文本参数,并最终给出相同的地址。在单程序示例中,有两个单独的文本,它们获得两个单独的地址

当编译器遇到字符串文字时,它会在二进制输出文件中为其留出空间(有时称为“数据段”)。这是二进制文件中专门用于数据而不是可执行代码的位置。根据编译器的决定,它可能会在文件中选择不同的位置。但是,因为数据在文件中,所以每次运行时,文件的地址始终相同

在第一个示例中,您有两个不同的二进制文件,每个文件都只有一个字符串文本,编译器碰巧对放置字符串的位置做出了相同的决定,因此它们都给出了相同的答案

在第二个示例中,您有一个二进制文件,其中包含两个不同的字符串文本,因此它们当然有单独的地址


*从技术上讲,分别有两个和四个文本;我关注的是用作函数参数的文本。

字符串文本的地址完全依赖于编译器。在您的例子中,两个独立的程序各自编译一个*字符串文本参数,并最终给出相同的地址。在单程序示例中,有两个单独的文本,它们获得两个单独的地址

当编译器遇到字符串文字时,它会在二进制输出文件中为其留出空间(有时称为“数据段”)。这是二进制文件中专门用于数据而不是可执行代码的位置。根据编译器的决定,它可能会在文件中选择不同的位置。但是,因为数据在文件中,所以每次运行时,文件的地址始终相同

在第一个示例中,您有两个不同的二进制文件,每个文件都只有一个字符串文本,编译器碰巧对放置字符串的位置做出了相同的决定,因此它们都给出了相同的答案

在第二个示例中,您有一个二进制文件,其中包含两个不同的字符串文本,因此它们当然有单独的地址


*从技术上讲,分别有两个和四个文本;我主要关注用作函数参数的文本。

C++以实现定义的方式将字符串的内容放入内存。通常,程序的所有字符串都会背靠背地放在内存段中,并用
'\0'
终止符标记它们的结束。实际的位置主要取决于编译器,但也取决于是否存在其他常量,这些常量可能位于您正在打印的地址之前

这就是为什么对来自不同程序的地址进行比较是毫无意义的。编译器可以在任何位置自由放置字符串文字的表示形式

例如,地址可能会因向程序中添加另一个字符串文字而更改。此代码打印的地址

cout << addr("Hello, world!") << endl;
cout << "Here is the address: " << addr("Hello, world!") << endl;

coutC++以实现定义的方式将字符串的内容放入内存。通常,程序的所有字符串都会背靠背地放在内存段中,并用
'\0'
终止符标记它们的结束。实际的位置主要取决于编译器,但也取决于是否存在其他常量,这些常量可能位于您正在打印的地址之前

这就是为什么对来自不同程序的地址进行比较是毫无意义的。编译器可以在任何位置自由放置字符串文字的表示形式

例如,地址可能会因向程序中添加另一个字符串文字而更改。此代码打印的地址

cout << addr("Hello, world!") << endl;
cout << "Here is the address: " << addr("Hello, world!") << endl;

<代码>什么意思?当你说编译器依赖的时候,你应该做一些研究,学习“字符串文字”如何在C++代码中工作。简言之,字符串文本放在已编译程序的数据段中,并且在每次运行程序时始终具有相同的地址,因为它是编译器创建的二进制文件的一部分。编译器决定在文件中放置字符串的位置。这与操作系统在运行时决定将其放置在何处的变量或堆对象不同。“编译器相关”意味着不同的编译器,甚至是具有不同选项的同一编译器,可以将字符串数据放置在二进制文件内的不同位置。当你说依赖于编译器时,你是什么意思?你应该做一些研究,学习“字符串文字”如何在C++代码中工作。简言之,字符串文本放在已编译程序的数据段中,并且在每次运行程序时始终具有相同的地址,因为它是编译器创建的二进制文件的一部分。编译器决定在文件中放置字符串的位置。这与操作系统在运行时决定将其放置在何处的变量或堆对象不同。“编译器相关”意味着不同的编译器,甚至是具有不同选项的同一编译器,可能会将字符串数据放置在二进制文件中的不同位置。