我的问题是为什么数组的地址与其第一个位置的地址不同?
我正在尝试编写自己的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中实现这一目标?感谢帮助!
我一直在努力,我似乎无法正常工作.我正在返回一个指针列表的最后一个值,我想打印它,但它打印一个非常随机的数字.我假设这是指针的内存地址,但是当我取消引用它时,我的输出仍然做同样的事情.
我的指针列表是一个指针列表,如: list<int*> pointerList
例如,这是我的方法返回:
int* end() { return (pointerList.back()); }
Run Code Online (Sandbox Code Playgroud)
这就是我的称呼方式.
int* totry = ca.end();
cout << *totry;
Run Code Online (Sandbox Code Playgroud)
这是打印内存地址而不是值.有没有人有任何想法如何解决这个问题?
提前致谢!
编辑:这是int指针指向的内容:我有一个值列表,例如,[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
我有一个指针列表,指向该列表的不同部分,如下所示:
[0,4,8,12]
Run Code Online (Sandbox Code Playgroud)
我有代码: int* end() { return (pointerList.back()); }在我的Header文件中,以及我的.cpp文件中的调用:
int*totry = ca.end(); cout <<*totry;
这是我声明我的指针列表的方式
class ptrList
{
public:
std::list<value_type> listOfValues;
std::list<*int> pointerlist;
Run Code Online (Sandbox Code Playgroud)
我在"添加"功能中填写我的列表指针,我这样做:
int lstsqrt = 4;
for (int a = 1; a < lstsqrt; a++)
{
int endptr = a + (int)lstsqrt;
pointerlist.push_back((&*listOfValues.begin() + endptr)); //( (lstsqrt - 1) + a) );
}
Run Code Online (Sandbox Code Playgroud)
这是我的end()方法 …
可能重复:
在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中的指针.
我的问题是我已经读过,如果我们想要改变变量的值,我们必须将指针传递给它(即我们想要修改的值的位置).这是什么意思?我的意思是,我们必须传递指向函数的指针吗?声明的含义是什么,"我们必须将指针传递给我们想要修改的位置".
这里对C很新,我认为我几乎没有掌握指针的概念,但语法有点令人困惑所以我在试图理解这个表达式的x = (char *) &a;含义时遇到了麻烦.
其余功能供参考:
#include<stdio.h>
int main()
{
int a;
char *x;
x = (char *) &a;
a = 512;
x[0] = 1;
x[1] = 2;
printf("%d\n",a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更具体地说,为什么有必要写x = (char *) &a;而不是仅仅x = &a;?添加了(char *)什么来改变表达式?
假设您有以下代码:
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,即它们都应该具有相同的地址 - 它们只是同一内存的名称别名.看着 …