标签: memory-address

是否可以将标签的地址存储在变量中并使用goto跳转到它?

我知道每个人都讨厌搞砸.在我的代码中,由于我考虑过并且很满意的原因,他们提供了一个有效的解决方案(即我不是在寻找"不要那样做"作为答案,我理解你的预订,并理解我为什么使用它们无论如何).

到目前为止,它们一直很棒,但我希望以这样的方式扩展功能,这要求我基本上能够存储指向标签的指针,然后再转到它们.

如果此代码有效,它将代表我需要的功能类型.但它不起作用,30分钟的谷歌搜索没有透露任何东西.有没有人有任何想法?

int main (void)
{
  int i=1;
  void* the_label_pointer;

  the_label:

  the_label_pointer = &the_label;

  if( i-- )
    goto *the_label_pointer;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c label pointers goto memory-address

53
推荐指数
8
解决办法
3万
查看次数

为什么不显示char数据的地址?

class Address {
      int i ;
      char b;
      string c;
      public:
           void showMap ( void ) ;
};

void Address :: showMap ( void ) {
            cout << "address of int    :" << &i << endl ;
            cout << "address of char   :" << &b << endl ;
            cout << "address of string :" << &c << endl ;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

         address of int    :  something
         address of char   :     // nothing, blank area, that is nothing displayed
         address of …
Run Code Online (Sandbox Code Playgroud)

c++ cout memory-address

50
推荐指数
4
解决办法
2万
查看次数

Python中未分配的字符串如何在内存中有地址?

谁可以给我解释一下这个?所以我一直在python中使用id()命令,并遇到了这个:

>>> id('cat')
5181152
>>> a = 'cat'
>>> b = 'cat'
>>> id(a)
5181152
>>> id(b)
5181152
Run Code Online (Sandbox Code Playgroud)

除了一部分之外,这对我有意义:字符串'cat'在我将其分配给变量之前在内存中有一个地址.我可能只是不明白内存寻址是如何工作的,但是有人可以向我解释这一点,或者至少告诉我应该读一下内存寻址吗?

所以这一切都很好,但这让我更加困惑:

>>> a = a[0:2]+'t'
>>> a
'cat'
>>> id(a)
39964224
>>> id('cat')
5181152
Run Code Online (Sandbox Code Playgroud)

这让我感到很奇怪,因为'cat'是一个地址为5181152的字符串,但是新的a具有不同的地址.所以,如果内存中有两个'cat'字符串,为什么不为id('cat')打印两个地址?我最后的想法是连接与地址的变化有关,所以我尝试了这个:

>>> id(b[0:2]+'t')
39921024
>>> b = b[0:2]+'t'
>>> b
'cat'
>>> id(b)
40000896
Run Code Online (Sandbox Code Playgroud)

我本来可以预测ID是相同的,但事实并非如此.思考?

python memory-address

45
推荐指数
4
解决办法
2010
查看次数

如何在C中打印变量地址?

当我运行此代码.

#include <stdio.h>

void moo(int a, int *b);

int main()
{
    int x;
    int *y;

    x = 1;
    y = &x;

    printf("Address of x = %d, value of x = %d\n", &x, x);
    printf("Address of y = &d, value of y = %d, value of *y = %d\n", &y, y, *y);
    moo(9, y);
}

void moo(int a, int *b)
{
    printf("Address of a = %d, value of a = %d\n", &a, a);
    printf("Address of b = %d, value of b …
Run Code Online (Sandbox Code Playgroud)

c pointers memory-address

42
推荐指数
2
解决办法
14万
查看次数

逻辑地址和物理地址之间的区别?

我正在阅读操作系统概念,我在第8章!但是,我可以使用一些澄清,或者保证我的理解是正确的.

逻辑地址:根据本书,CPU生成逻辑地址.这到底是什么意思?(在执行生成的地址系统中..)我假设在为程序编译代码时,程序知道代码将在何处加载到内存中.所有编译器都会设置程序布局的一般草图以及图像的布局方式,但不会为其分配任何实际地址.当程序执行时,CPU获取编译器生成的这个布局图像,并将一些地址(逻辑1)分发给从代码生成的地址.

物理地址:直到CPU生成一组逻辑地址(由基地址和偏移量组成)之后才生成物理地址.逻辑地址通过MMU或其他设备,沿着线路的某处,逻辑地址映射到物理RAM地址.

那么实际差异是什么?我可以看到一个好处.使用逻辑地址为应用程序提供了更多自由.如果物理地址是硬编码的,那么程序的成功将在很大程度上取决于物理计算机,可用的RAM地址等.

转换为物理地址的逻辑地址的使用是否会产生两个步骤而不是一对一,因此更多地超过?

然后逻辑地址在生成后驻留在哪里?它们可能存在于CPU上的寄存器中,而CPU正在为一个进程提供服务,但在它之前和之后,它们去哪里了?我理解这是依赖于实现的.我假设它们可能存储在CPU的某些特殊寄存器空间或缓冲区中,例如TLB,对吗?如果没有,那么表可能存在于实际的RAM本身中,而CPU只保存一个指针/地址到RAM中表的基地址,对吗?

看起来保持RAM中的地址对逻辑存储器地址的目的是有效的.我只能假设我的理解不正确.

memory-management tlb memory-address mmu

38
推荐指数
2
解决办法
15万
查看次数

C++程序中函数的地址是什么?

由于该函数是存储在一个连续内存块中的指令集.

并且函数(入口点)的地址是函数中第一条指令的地址.(据我所知)

因此我们可以说函数的地址和函数中第一条指令的地址是相同的(在这种情况下,第一条指令是变量的初始化.).

但是下面的程序与上述内容相矛盾.

码:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char ** fun()
{
    static char * z = (char*)"Merry Christmas :)";
    return &z;
}
int main()
{
    char ** ptr = NULL;

    char ** (*fun_ptr)(); //declaration of pointer to the function
    fun_ptr = &fun;

    ptr = fun();

    printf("\n %s \n Address of function = [%p]", *ptr, fun_ptr);
    printf("\n Address of first variable created in fun() = [%p]", (void*)ptr);
    cout<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一个输出示例是:

 Merry Christmas :) 
 Address of …
Run Code Online (Sandbox Code Playgroud)

c++ function-pointers function memory-address

32
推荐指数
6
解决办法
1万
查看次数

禁用内存地址的随机化

我正在尝试调试使用大量指针的二进制文件.有时为了快速查看输出以找出错误,我打印出对象的地址及其相应的值,但是,对象地址是随机的,这违背了快速检查的目的.有没有办法临时/永久禁用它,以便每次运行程序时都得到相同的值.

哎呀.操作系统是Linux fsttcs1 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

linux memory-address aslr

31
推荐指数
3
解决办法
2万
查看次数

如何从Linux中的用户空间访问物理地址?

在运行Linux的基于ARM的系统上,我有一个内存映射到物理地址的设备.从所有地址都是虚拟的用户空间程序,我如何从该地址读取内容?

linux memory arm memory-address memory-mapping

29
推荐指数
2
解决办法
4万
查看次数

x86 Assembly和yasm中immediates(方括号)的基本用法

假设我声明了以下内容:

section .bss
buffer    resb     1
Run Code Online (Sandbox Code Playgroud)

这些说明如下:

mov    al, 5                    ; mov-immediate
mov    [buffer], al             ; store
mov    bl, [buffer]             ; load
mov    cl, buffer               ; mov-immediate?
Run Code Online (Sandbox Code Playgroud)

我是否理解bl将包含值5,并且cl将包含变量的内存地址section .text

我对两者之间的差异感到困惑

  • 立即进入登记册,
  • 将寄存器移动到立即(进入的是什么,数据或地址?)和
  • 在没有括号的情况下立即移动到寄存器中
    • 例如,buffervsmov cl, buffer

更新:阅读回复后,我认为以下摘要是准确的:

假设声明mov cl, [buffer]存在于mov edi, array.我的理解是:

  • edi将第0个数组索引的内存地址放入mov byte [edi], 3.
  • add edi, 3 将VALUE 3放入数组的第0个索引中
  • 之后edi,mov al, [array]现在包含数组第3个索引的内存地址
  • al将DATA置于第零个索引中mov al, [array+3].
  • al将DATA放在第三个索引处mov [al], …

x86 assembly nasm memory-address yasm

28
推荐指数
3
解决办法
2万
查看次数

c中的数组名称究竟是什么?

我很难理解C中数组名称的类型和用法.这可能看起来很长,但请耐心等待.

我理解以下语句声明a是类型,int []整数数组.

int a[30];
Run Code Online (Sandbox Code Playgroud)

同时a也指出数组的第一个元素和类似*(a+2)的东西是有效的.因此,a看起来像一个指向整数指针.但实际上类型int []int*不同; 前者是数组类型,后来是指向整数指针.

类型int []变量int*在传递给函数时也会转换为类型变量; 因为C数组是通过引用传递的(sizeof运算符除外).

这就是让我垂涎的观点.看看下面这段代码:

int main()
{
    int (*p)[3];
    int a[3] = { 5, 4, 6 };

    p = &a;

    printf("a:%d\t&a:%d\n",a,&a);
    printf("%d",*(*p + 2));
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

a:2686720       &a:2686720
6
Run Code Online (Sandbox Code Playgroud)

那么,上面的代码是如何工作的呢?我有两个问题:

  1. a&a具有相同的值.为什么?
  2. 到底是int (*p)[3];做什么的?它声明了一个 …

c arrays pointers memory-address

28
推荐指数
2
解决办法
5750
查看次数