标签: memory-address

为什么在增加指针的整数值时会得到一个随机数?

我是一名专业的 C# 程序员,但我对 C++ 很陌生。我对指针的基本概念很好,但我一直在玩。您可以通过将指针转换为 来获取指针的实际整数值int

int i = 5;
int* iptr = &i;
int ptrValue = (int)iptr;
Run Code Online (Sandbox Code Playgroud)

这是有道理的;这是一个内存地址。但是我可以移动到下一个指针,并将其转换为int

int i = 5;
int* iptr = &i;
int ptrValue = (int)iptr;
int* jptr = (int*)((int)iptr + 1);
int j = (int)*iptr;
Run Code Online (Sandbox Code Playgroud)

我得到了一个看似随机的数字(虽然这不是一个好的 PSRG)。这个数字是多少?它是同一进程使用的另一个号码吗?它可能来自不同的过程吗?这是不好的做法,还是不允许的?如果没有,这有什么用吗?这有点酷。

c++ int pointers memory-address

0
推荐指数
1
解决办法
285
查看次数

JMP 和 CALL 如何在汇编程序中工作?

如果你编译、链接和运行这样的东西:

global _start

section .text

_start:
jmp message

proc:
...

message:
    call proc
    msg db " y0u sp34k 1337 ? "

section .data
Run Code Online (Sandbox Code Playgroud)
  1. 机器如何知道他需要跳到哪里?我猜“消息:”和“过程:”被翻译成地址。
  2. "message:" 和 "proc:" 有绝对地址还是相对地址?
  3. 如果我在我的 PC 上编译程序并在另一台 PC 上执行它,它如何在另一台机器上运行?我的意思是关于“消息:”和“过程:”的地址。它会永远是一个不同的地址吗?

x86 assembly compilation memory-address

0
推荐指数
1
解决办法
653
查看次数

输出数组成员的连续地址

在此处输入图片说明

我画这个是为了更好地理解。在 PC 的内存中有连续的内存区域,长度为 1 个字节(绿色区域)。它们可以分组以表示更大的数据(如int我们的示例中的an )。

我想添加到这张图片中的是,绿色方块是连续的地址,如0x000000后跟0x000001等。然后地址从arr四跳,0x000000下一个将是0x000004(因为int在这方面是4bytes)。

代码_1

int arr[4] = {1,2,3,4};

int *p = arr;

cout << p << endl;
cout << ++p << endl;
cout << ++p << endl;
cout << ++p << endl;
Run Code Online (Sandbox Code Playgroud)

输出_1

0x69fedc
0x69fee0
0x69fee4
0x69fee8
Run Code Online (Sandbox Code Playgroud)

代码_2

char arrr[5] = {'1','2','3','4', '\n'};

char *ptr = arrr;

cout << &ptr << endl;
cout << &(++ptr) << endl; …
Run Code Online (Sandbox Code Playgroud)

c++ arrays memory-address

0
推荐指数
1
解决办法
51
查看次数

为什么指向 int 的指针用“*int”而不是“&amp;int”初始化?

例如,当初始化一个指向 int 的指针时,我们使用:

var pointer *int
Run Code Online (Sandbox Code Playgroud)

为什么语法不是:

var pointer &int
Run Code Online (Sandbox Code Playgroud)

对我来说,第二个版本更有意义,因为它读起来像“变量‘指针’是一个整数的内存地址”

或者换句话说,我发现“*”既用于定义内存地址类型(如上所述)又用于取消引用,例如 *pointer = 123

这是否像看起来那样令人困惑,还是我在这里遗漏了什么?

pointers reference go memory-address dereference

0
推荐指数
1
解决办法
169
查看次数

指针指向结构中的另一个指针

我有以temp成员命名的结构n

struct temp
{
    int n;
}
Run Code Online (Sandbox Code Playgroud)

我希望声明一个指向p访问成员的指针n

struct temp *p
Run Code Online (Sandbox Code Playgroud)

如何进入构件n由另一个指针p1指向指针p

c++ struct pointers member memory-address

0
推荐指数
1
解决办法
72
查看次数

向地址添加 1 会导致向该地址添加 0xE0

在尝试向使用&运算符获得的地址添加偏移量时,我遇到了一个非常奇怪的行为。因此,当我尝试向该地址添加任何数字时,结果是该地址加上我的数字乘以0xE0(224)。

偏移量 0

偏移 1

偏移 2

这些是 Visual Studio 中监视列表的屏幕截图。每个截图的第一行是我的对象地址的访问,这是正确的。第二行是相同的访问,但我们向它添加了变量偏移量。第三行只是偏移量本身。

如您所见,第一个屏幕截图上的一切都很好。但是在第二个上,加法是0xE0( 0xE38-0xD58=0x0E0) 而不是 1 应该是。在最后一个屏幕截图中,添加的0x1C02*0xE0.

在第二行,我希望0x00000255ef9bed58在第一个屏幕截图、0x00000255ef9bed59第二个屏幕截图和0x00000255ef9bed5a最后一个屏幕截图中看到。

c c++ memory memory-address

0
推荐指数
1
解决办法
103
查看次数

一维/二维数组指针的底层类型是什么,为什么需要双重解引用?

假设我这样初始化数组和变量:

int arr1d[3] = { 1, 2, 3 };
int* arrptr = arr1d;
int (*ptr1d)[3] = &arr1d;

int arr2d[2][3] = { {1, 2, 3}, {4, 5, 6} };
int (*ptr2d)[3] = arr2d;
Run Code Online (Sandbox Code Playgroud)

所以,arr1d是一个由 3 个整数组成的数组。在底层,arr1d是一个指向数组第一个元素的指针,即&arr1d[0]. 因此,我们可以赋值arr1dint* arrptr

ptr1d指向一个由 3 个整数组成的数组。arr1dint*指向&arr1d[0],但为什么是&arr1d类型int (*)[3]?天真地,我认为写作&arr1d只是给了我们一个地址来分配给指针。这是特定于指向数组的指针吗?

显然,arr2d是类型int (*)[3]我从这篇文章中学到的)。双方ptr2d*ptr2d具有相同的值,所以这是为什么第二解引用甚至是必要的?我的想法是,这可能是因为ptr2d类型是int (*)[3] …

c++ pointers multidimensional-array memory-address dereference

0
推荐指数
1
解决办法
64
查看次数

C 怎么可能 unsigned int 只需要两个字节?

我在玩指针,我注意到一件奇怪的事情。

我有一个结构如下:

typedef struct list_element_struct {
    uint32_t x; 
    uint32_t y; 
    uint32_t z; 
    struct list_element_struct *next; 
    }list_element;
Run Code Online (Sandbox Code Playgroud)

据我所知,unsigned int 的大小为 4 个字节,指针的大小为 8 个字节。这里也有 8 个字节对齐,所以这个结构的大小是 24 个字节。

我已经初始化了上述结构对象的列表,list_element els[5];并将其中的每条数据设置为 0memset(els,0,5*sizeof(list_element));

现在我正在尝试使用以下代码查看它们的内存位置:

printf("%p start location of els\n", &(els));
printf("%p start location of els->x\n", &(els->x));
printf("%p start location of els->y\n", &(els->y));
printf("%p start location of els->z\n", &(els->z));
printf("%p start location of els->next(pointer)\n", &(els->next));
printf("%p start location of els+1\n", &(els[1]));
Run Code Online (Sandbox Code Playgroud)

我打印出来的是:

0x7ffeeba4a970 start location of els
0x7ffeeba4a970 start location of …
Run Code Online (Sandbox Code Playgroud)

c hex struct offset memory-address

0
推荐指数
1
解决办法
76
查看次数

C语言地址分配查询

你能帮我理解这个基本项目吗:

我有两个变量 i 和 J ,我的查询是我已经初始化了“I”,然后是“J”,但是第一个地址被分配给了 J 而不是“I”。

你能帮我理解为什么吗?

I 和比 J 高 4 位的地址

#include<stdio.h>
int main()
{
    int i;
    printf("%d",sizeof(int));
    printf("enter the number to multiply wuth 1 through 10:");
    scanf("%d",&i);
    printf("size of I:%d\n",sizeof(i));
    for(int j=0;j<=10;j++){
    
        printf("%d\n",i*j);
        printf("Address of j:%d\n",&j);
    }
    printf("%d",&i);
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

c memory-address

0
推荐指数
1
解决办法
57
查看次数

数组的偏移量是如何表示数组的起始地址的

考虑汇编代码 -mov edi, offset newarray
根据我所阅读的内容,这会将 的地址newarray放入寄存器edi
我不明白的是这个术语 这个术语offset的英文含义如何
适合这里。

x86 assembly terminology masm memory-address

0
推荐指数
1
解决办法
52
查看次数