标签: memory-address

数组的地址与数组[0]的地址 - C语言

我的问题是为什么数组的地址与其第一个位置的地址不同?

我正在尝试编写自己的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]每次都是一些随机地址.我期待地址相互匹配.任何人都可以解释为什么不是这种情况?

c arrays malloc char memory-address

4
推荐指数
3
解决办法
1万
查看次数

如何将main函数始终加载到同一地址,而变量在大多数时间内具有不同的地址?

我今天写了这个小程序,我对结果感到震惊.这是程序


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 linux virtualization relocation memory-address

4
推荐指数
1
解决办法
1893
查看次数

Java:如何在C++中存储和检索内存地址

我来自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中实现这一目标?感谢帮助!

java jvm unsafe memory-address

4
推荐指数
1
解决办法
2739
查看次数

打印int指针的值

我一直在努力,我似乎​​无法正常工作.我正在返回一个指针列表的最后一个值,我想打印它,但它打印一个非常随机的数字.我假设这是指针的内存地址,但是当我取消引用它时,我的输出仍然做同样的事情.

我的指针列表是一个指针列表,如: 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++ printing pointers list memory-address

4
推荐指数
1
解决办法
796
查看次数

stringstream的第一个字符串参数保存为指针/垃圾

可能重复:
在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)

c++ pointers stringstream memory-address

4
推荐指数
1
解决办法
1089
查看次数

获取接口内的值的地址

如何获取接口内的值的地址?

我有一个存储在接口中的结构,在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)

这是怎么回事?由于结构存储在接口中,为什么我不能获得指向它的指针?

pointers interface go memory-address

4
推荐指数
1
解决办法
2130
查看次数

如何将掩码应用于const void*地址?

我在嵌入式目标上工作,并希望定义内存池.

内存地址表示为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 casting memory-address

4
推荐指数
1
解决办法
694
查看次数

如何&a是一个指针,如果它生成一个?的地址?

我是编程新手,目前我正在学习C中的指针.

  1. 我知道指针是包含或保存另一个变量的地址的变量.今天当我用K&R更多地了解它时,我感到很困惑,在第80页的给定函数交换(&a,&b)中,"&a是指向a的指针".如何&a是指针?它不是变量,而是变量的地址.我对吗?
  2. 我知道参数可以通过两种方式传递给函数:按值调用和按引用调用.参数的调用者值在第一个中没有改变,但可以在第二个中改变.

我的问题是我已经读过,如果我们想要改变变量的值,我们必须将指针传递给它(即我们想要修改的值的位置).这是什么意思?我的意思是,我们必须传递指向函数的指针吗?声明的含义是什么,"我们必须将指针传递给我们想要修改的位置".

c pointers memory-address

4
推荐指数
1
解决办法
453
查看次数

这个表达式(char*)在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 *)什么来改变表达式?

c pointers memory-address

4
推荐指数
1
解决办法
294
查看次数

为什么auto y = reference_to_x的地址与x的地址不一样?

假设您有以下代码:

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,即它们都应该具有相同的地址 - 它们只是同一内存的名称别名.看着 …

c++ pointers reference memory-address

4
推荐指数
1
解决办法
162
查看次数