我的问题是为什么数组的地址与其第一个位置的地址不同?
我正在尝试编写自己的malloc,但首先我只是分配一大块内存并使用地址.我的代码看起来大致如下:
#define BUFF_SIZE 1024
static char *mallocbuff;
int main(){
mallocbuff = malloc(BUFF_SIZE);
printf("The address of mallocbuff is %d\n", &mallocbuff);
printf("The address of mallocbuff[0] is %d\n", &mallocbuff[0]);
}
Run Code Online (Sandbox Code Playgroud)
&mallocbuff每次运行时都是相同的地址.&mallocbuff [0]每次都是一些随机地址.我期待地址相互匹配.任何人都可以解释为什么不是这种情况?
我今天写了这个小程序,我对结果感到震惊.这是程序
int main(int argc, char **argv)
{
int a;
printf("\n\tMain is located at: %p and the variable a is located at address: %p",main,&a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上,主函数总是加载在地址"0x80483d4"并且变量的地址保持不变这是怎么发生的?我在操作系统中读到,作为虚拟化方案的一部分,操作系统不断重新定位指令地址.那么为什么每次我运行这个程序时主要加载到同一个地址呢?
先谢谢你们.
我来自C++背景.在C++中,我可以存储一个内存地址,我刚刚在全局数组中新建,并在以后重新使用它.例如,假设我有两个类X,Y和我创建两个对象x,y.全局数组StoreAddresses [2]定义为:
uint32_t StoreAddresses[2];
Run Code Online (Sandbox Code Playgroud)
我写:
X * x = new X();
Y * y = new Y();
StoreAdresses[0] = (uint32t *) x; //for example, 0x12345678
StoreAdresses[1] = (uint32t *) y; //for example, 0x12345698
Run Code Online (Sandbox Code Playgroud)
在我的程序中的任何地方,我都可以通过调用来检索内存中写入的数据:
X * stored_x = (X*)StoreAdresses[0];
Y * stored_y = (Y*)StoreAdresses[1];
Run Code Online (Sandbox Code Playgroud)
我怎样才能在Java中实现这一目标?感谢帮助!
可能重复:
在C++中将字符串打印到临时流对象
std :: ostringstream打印c-string的地址而不是其内容
我正在尝试使用stringstream构建一个字符串,就像你使用cout一样.这适用于类似日志记录的类.我遇到的问题是,如果<<运算符的第一个参数是一个字符串,当我随后使用stringstream :: str()调用打印出该字符串流时,我得到一个垃圾地址,而不是字符串.这只发生在FIRST字符串中.后续字符串很好.数字总是好的.这是代码:
// class I use to print out the stream
class StreamWriter
{
public:
StreamWriter()
{}
~StreamWriter()
{
std::string myMessage = m_stringstream.str();
std::cout << myMessage << std::endl;
}
std::stringstream m_stringstream;
};
// macro for simplification
#define OSRDEBUG (StreamWriter().m_stringstream)
// actual use
OSRDEBUG << "Hello " << "my " << "name is Pris " << 123456;
// output
0x8054480my name is Pris 123456
0x8054480my name is Pris 123456
0x8054480my name is Pris 123456
0x8054480my …Run Code Online (Sandbox Code Playgroud) 如何获取接口内的值的地址?
我有一个存储在接口中的结构,在list.List元素中:
import "container/list"
type retry struct{}
p := &el.Value.(retry)
Run Code Online (Sandbox Code Playgroud)
但我明白了:
cannot take the address of el.Value.(retry)
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?由于结构存储在接口中,为什么我不能获得指向它的指针?
我在嵌入式目标上工作,并希望定义内存池.
内存地址表示为void*.但是在特定情况下,这些地址被缓存,我想要解除它们以直接获得"真实"硬件地址.
我想定义开头的地址memory_area(这只是一个标记):
#define UNCACHE_MASK 0xABCDEF12UL // Value of the mask to apply
extern uint32_t memory_area; // Global, defined somewhere else
const void * virtual_address = &memory_area; // OK
const void * real_address =
(void*)(virtual_address | UNCACHE_MASK); // guilty line
Run Code Online (Sandbox Code Playgroud)
不幸的是,GCC不会让我这样做:
error: invalid operands to binary | (have 'const void *' and 'long unsigned int')
Run Code Online (Sandbox Code Playgroud)
无奈之下我试过:
const void * real_address =
(void*)(((uint32_t)virtual_address) | UNCACHE_MASK); // guilty line
Run Code Online (Sandbox Code Playgroud)
徒然:
error: initializer element is not constant …Run Code Online (Sandbox Code Playgroud) 这可以在 C 中得到保证,因为 WG14/N1570 中有以下句子:
6.2.5/20 ... 数组类型描述了具有特定成员对象类型的连续分配的非空对象集,称为元素类型。
但是在WG21/N4527中,即在C++中,对应的句子变成了
8.3.4/1 ...数组类型的对象包含连续分配的 N 个 T 类型子对象的非空集合。
而“描述”一词改为“包含”,这不能保证数组的地址等于它的第一个元素的地址。这种改变是有意的还是无意的?如果是故意的,数组的地址是否等于它在 C++ 中的第一个元素的地址?如果是这样,C++ 标准中的哪一段可以保证这一点?
我仍在学习 C++ 并且花了几个小时试图找出一种方法来将一个字节存储在某个内存地址,在我的情况下,所有(几乎所有)内存地址都不是动态的 - 所以地址指向,对于示例变量不会改变。
所以我试图检索存储在已知内存地址的单个字节。例如,让我们说:0x20000
例如,我试图检索的字节是0xEF.
现在我将如何在不使用取消引用运算符的情况下检索字节?所以基本上我需要在0xEF不必声明它是什么类型的数据类型的情况下获取,就像字面上只是物理获取字节一样0xEF。希望这是有道理的,我是个菜鸟:/
假设您有以下代码:
long& fn2(long& another_var1, long another_var2){
another_var1 = another_var1 + another_var2;
another_var2 = another_var2 + another_var1;
return another_var1;
}
int main (){
cout << boolalpha;
long var1 = 5;
long var2 = 10;
auto result = fn2(var1, var2);
cout << &result << endl;
cout << &var1 << endl;
cout << result << endl; //Line 1
cout << (&result == &var1) << endl; //Line 2
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作,直到你到达Line 2,false返回的地方.当你auto result,它应该是一个引用变量another_var1,它是一个引用var1,即它们都应该具有相同的地址 - 它们只是同一内存的名称别名.看着 …
我有一个需要传递内存地址的函数。我只是设法发现我们可以使用 println!("{:p}", number) 打印出一个内存地址。如何访问内存地址并在函数中使用它?