Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在Linux中读取和更改内存中的值?_C_Linux_Pointers_Memory - Fatal编程技术网

C 如何在Linux中读取和更改内存中的值?

C 如何在Linux中读取和更改内存中的值?,c,linux,pointers,memory,C,Linux,Pointers,Memory,main.c中的代码 #include <stdio.h> #include <unistd.h> int main() { int c_variable = 0; // the target for(int x = 0; x < 100; x++) { c_variable += 5; // increase by 5 to change the value of the int printf("%i\n", c

main.c中的代码

#include <stdio.h>
#include <unistd.h>

int main() {
    int c_variable = 0; // the target

    for(int x = 0; x < 100; x++) {
        c_variable += 5; // increase by 5 to change the value of the int
        printf("%i\n", c_variable); // print current value
        sleep(8); // sleep so I have time to scan memory
    }

    return 0;

}
但是我得到了一些随机的长串数字,而不是当前的数字。我读过的关于如何在linux上读写内存的教程和答案不必使用
long unsigned
,而是可以使用char*或int*。我的内存地址似乎有点长,很久以前我还没有看到内存地址。无论如何,如何读取和写入整数
c_变量的内存地址

编辑:scanmem的输出如下所示

info: we currently have 3 matches.
3> list
[ 0] 7771ff64b090,  6 +        1e090, stack, 20, [I64 I32 I16 I8 ]
[ 1] 7771ff64b5d8,  6 +        1e5d8, stack, 20, [I64 I32 I16 I8 ]
[ 2] 7771ff64b698,  6 +        1e698, stack, 20, [I32 I16 I8 ]
3> set 50
info: setting *0x7771ff64b090 to 0x32...
info: setting *0x7771ff64b5d8 to 0x32...
info: setting *0x7771ff64b698 to 0x32...
输出

...
150
155
160
165
170
175
55
60
65
...

您正在打印实际的地址号,但使用十进制表示法,而不是地址上的数字

const int *addr = (int *) 0x772d85fa1008;
printf("%d\n", *addr);
您必须将
addr
声明为指针类型。更具体地说,是指向整数的指针。其值(
0x772d85fa1008
)包含整数的地址

然后,在
printf
中调用该函数,将其解引用以获得存储在地址中的实际整数


尽管在实践中,我不能保证这是否可行,因为现代操作系统中的内存并不像你想象的那么简单。但是我没有足够的知识来评估这一点。

在Linux下运行的进程通常都有自己的虚拟化内存空间。如果您想访问另一个进程的内存空间,Linux API中已经做出了安排,请参阅shmctl、shmget、shmat、shmdt。

您正在打印实际地址号,不是地址上的数字。随机数字串是否与0x772d85fa1008或其十进制表示131037404991496相同?您是否知道,在大多数当前操作系统中,两个运行程序的地址空间彼此独立?同一个地址可以在不同的程序中保存不同的值。@Yunnosch你能给我推荐一个学习资源,我可以在那里读到这个吗?一个有效的问题,但我不得不让你失望。我不知道推荐的资源。我得到一个错误:
无法用long类型的右值初始化const int*类型的变量,因为地址太长了。是不是太长了?我看到的所有教程都使用int,但是这个地址太长了,不是吗?在赋值之前,尝试将地址常量转换为指针。请参阅我的编辑。@boool3max导致
分段错误(内核转储)
并且在sudo中运行程序会导致找到的所有三个地址出现
分段错误。请看我在帖子中的编辑。这是你的答案。进程之间的内存并不是那么简单
const int *addr = (int *) 0x772d85fa1008;
printf("%d\n", *addr);