C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?
In C++ why address of string, despite being in hexadecimal format, can't be stored in long int variable?
我有以下代码:
#include <iostream>
using namespace std;
int main(){
string texts[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"};
return 0;
}
代码:
cout << &texts[0] << endl;
给出输出:
0x7ffc7869f3c0
但是,
long int address = &texts[0];
给出编译时间错误:
In function ‘int main()’:
5.cpp:9:29: error: invalid conversion from ‘std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}’ to ‘long int’ [-fpermissive]
long int address = &texts[0];
为什么我会遇到此错误?
地址是地址,而不是数字。地址上的算术操作通常毫无意义(并且指针算术微妙不同),例如,乘以两个地址是没有意义的。
您可以使用uintptr_t
或intptr_t
。它是可以从地址和地址施放的积分类型。因此,您可以代码
uintptr_t ia = (uintptr_t)(&texts[0]);
但是您通常不应。在我的Linux X86-64上,uintptr_t
等于64位unsigned long
。
请记住,地址是处理器和操作系统和编译器,因此特定于系统。有时,它们在相同程序的"相同"执行之间有所不同(请阅读ASLR)。顺便说一句,在某些处理器上,地址比单个数字更复杂(例如,在1980年代x86处于16位模式)。
因此,如果您关心便携式C 代码(通常应该),则不需要将地址投入整体类型。
另一方面,如果要编码特定于处理器和操作系统的内容(例如,在低级系统呼叫上方的new
或malloc
的实现),您将关心地址中的各种位置,以便您可以将其施放(以不可便利的方式)。如果您要编码某些操作系统内核的虚拟内存子系统,您将更多地关心地址中的位等...
您的 cout << &texts[0]
产生了一些实现特定的输出,这主要对于调试目的是有意义的(但对于其他东西来说并不多)。C 11标准足够模糊以允许任何其他输出(我的感觉是,任何地址的pinkroses
的输出都符合标准的字母,但我可能是错误的)。因此,如果您关心可移植性,则不应依赖它(或任何具体的"编号"地址看起来像)。
更糟糕的是,从 uintptr_t
到一些指针,也相反。它们可能是可能的,但通常仅在某些特定系统上。而且它们仅在某些特定情况下才有意义。大多数数字不会制作明智的指针(例如,因为您的虚拟地址空间永远不会满足或致密),因此您不应该非常谨慎地投射它们。
一个相关的概念是关于未定义的行为。有很多有趣的事情要读和说。
- 是否可以将函数导入命名空间,但不能导出它?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- C++:返回本地对象,但不能正常工作
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 用C++替换std::字符串中的一个子字符串,但不能全部替换
- 我可以在Windows(Visual C++)中读取bin文件,但不能在linux(GCC)上读取bin文件
- QProcess可以启动程序,但不能启动python(命令行)
- 一个对象什么时候可以有非零大小的一个,但不能同时具有一个或多个字节的存储
- C++为什么字符串的地址尽管是十六进制格式,但不能存储在 long int 变量中?
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么