我想检查变量的地址
volatile int clock;
cout << &clock;
Run Code Online (Sandbox Code Playgroud)
但它总是说x在地址1.我做错了什么?
考虑这个(人为的)例子:
#include <cstdio>
#include <iostream>
int main() {
volatile char test[] = "abc";
std::printf("%s\n", test);
std::cout << test << "\n";
}
Run Code Online (Sandbox Code Playgroud)
使用GCC进行编译并运行会提供以下输出:
$ g++ test.cc
$ ./a.out
abc
1
Run Code Online (Sandbox Code Playgroud)
如您所见,printf打印时正确cout打印字符串1.为什么写cout产生1在这种情况下?
(与这个问题有关,抛弃挥发物是否安全?,但不完全相同,因为该问题与特定实例有关)
是否有过在那里虚掷的情况下volatile是不被认为是危险的做法?
(一个特定的例子:如果声明了一个函数
void foo(long *pl);
Run Code Online (Sandbox Code Playgroud)
我必须实施
void bar(volatile long *pl);
Run Code Online (Sandbox Code Playgroud)
有()我需要执行栏的一部分来调用foo(PL),然后好像我不能得到这个作为是工作,因为假设由foo的编制()和bar的调用者的编辑制作()不兼容.)
作为推论,如果我有一个volatile变量v,我想打电话给foo(&v)别人的功能void foo(long *pl),那人告诉我这是安全的,我可以调用之前投的指针,我的直觉是要告诉他们,他们错了,因为没有办法保证,void foo(volatile long *pl)如果他们想支持使用volatile变量,他们应该更改声明.我们哪一个是正确的?
请阅读以下C++代码和结果.根据一些维基页面,静态,自动和动态分配的变量分配在不同的地址空间中,即数据段,堆栈和堆.但是,在我看来,静态和动态变量的地址大致相同.为什么会这样?我怎么知道静态变量真的在数据段中,而不是在堆中?
一个更广泛的问题是,在C++中是否有可能知道每个地址空间的范围(或可用大小)?
我的另一个问题是为什么volatile变量的地址是1?
#include <iostream>
using namespace std;
static int i;
int main() {
cout << sizeof(int*) << endl;
int j;
int* k = new int[10];
volatile int l;
cout << &i << endl;
cout << &j << endl;
cout << k << endl;
cout << &l << endl;
delete[] k;
}
Run Code Online (Sandbox Code Playgroud)
结果:
8
0x1000010e4
0x7fff5fbff66c
0x100100080
1
Run Code Online (Sandbox Code Playgroud)